How to remove php extension and also redirect extensions to no extension form

妖精的绣舞 提交于 2020-01-24 07:46:50

问题


How can I have this in my htaccess:

/page.php => redirects to /page
/page => shows the page.php
/index => redirects to root

And how to remove trailing slashes from all URLs, specially the root one?

Although, I'm not familiar enough with Apache configs, but I could find these codes:

# To remove .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

# To remove trailing slashes
RewriteRule ^(.*)/$ /$1 [L,R=301]

# To redirect /index to root (not sure if it works correctly)
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

Could you please help me with the scenario and have it in one small code?

Thanks


According to answers, I could solve the problem using the codes below in my .htaccess file:

# To remove .php extension
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ (.*)\.php [NC]
RewriteRule ^ %1 [R=301,L]

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]

# To redirect /index to root
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

Now, I got a new problem and that is when I browse the files with a trailing slash, it redirects me to somewhere else and occurs a 404 (page not found) response, like this:

http://domain.tld/page/ => http://domain.tld/page/home/user/public_html/domain.tld/page

Also, if I move the second part to the end or even remove it completely, the server sends me a 500 (internal server error) response.


Finally with a little research, I could find the solution for previous problem using this advice:

https://stackoverflow.com/a/27264788/5420319

So, I've changed one of the codes from this:

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

To this:

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L]

And I also moved this part to the top regardless of being effective.


回答1:


Redirecting page.php to /page:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ /page\.php [NC]
RewriteRule ^ /page [R=301,L]

Now, setting back internally to page.php:

RewriteRule ^page$ /page.php [NC,L]

Remove trailing slashes:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

Now, checking whether a file for /some/page/foo such that /some/page/foo.php exists:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]



回答2:


A cleaned up and simplified version of the accepted answer is:

# To remove trailing slash
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

# To remove .php extension
RewriteRule ^(.*)\.php$ $1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]



回答3:


According the the answers and my own research, this would be the final answer:

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L]

# To remove .php extension
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ (.*)\.php [NC]
RewriteRule ^ %1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]

# To redirect /index to root
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]



回答4:


Options +FollowSymLinks
RewriteEngine on
AddHandler php5.3-fastcgi php
SetEnv no-gzip dont-vary

RewriteRule ^([a-z]+)$                                                  index.php?page=$1                                   [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)$                                      index.php?page=$1&subpage=$2                        [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)/([a-z0-9]+)$                          index.php?page=$1&subpage=$2&module=$3              [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)$              index.php?page=$1&subpage=$2&module=$3&submodule=$4 [QSA,L]

You can play with that.



来源:https://stackoverflow.com/questions/33021181/how-to-remove-php-extension-and-also-redirect-extensions-to-no-extension-form

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!