如何删除 php 扩展并将扩展重定向到无扩展形式

4L3*_*L3X 5 apache .htaccess mod-rewrite redirect

我怎样才能在我的 htaccess 中拥有这个:

/page.php => redirects to /page
/page => shows the page.php
/index => redirects to root
Run Code Online (Sandbox Code Playgroud)

以及如何从所有 URL(特别是根 URL)中删除尾部斜杠?

虽然我对 Apache 配置不太熟悉,但我可以找到这些代码:

# 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]
Run Code Online (Sandbox Code Playgroud)

您能帮我解决这个场景并将其写成一小段代码吗?

谢谢


根据答案,我可以使用 .htaccess 文件中的以下代码解决问题:

# 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]
Run Code Online (Sandbox Code Playgroud)

现在,我遇到了一个新问题,那就是当我浏览带有尾部斜杠的文件时,它会将我重定向到其他位置并出现 404(未找到页面)响应,如下所示:

http://domain.tld/page/ => http://domain.tld/page/home/user/public_html/domain.tld/page
Run Code Online (Sandbox Code Playgroud)

另外,如果我将第二部分移到末尾甚至完全删除它,服务器会向我发送 500(内部服务器错误)响应。


最后,通过一些研究,我可以使用以下建议找到之前问题的解决方案:

/sf/answers/1908535191/

因此,我更改了其中的代码:

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

对此:

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

而且我也把这部分移到了最上面,不管是否有效。

4L3*_*L3X 4

根据答案和我自己的研究,这将是最终答案:

# 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]
Run Code Online (Sandbox Code Playgroud)