将所有具有扩展名的URL重定向到无扩展名,包括在子目录中


Redirecting all URLs with extension to no extension, including in subdirectories

我正在寻找一种可以将https://example.com/foo.php重定向到https://example.com/foo以及将https://example.com/foo/重定向到https://example.com/foo的方法。

Stack Overflow上发布了大量的解决方案,但没有一个解决方案能够解决用户试图访问https://example.com/foo/bar/baz.php等文件的实例。

有人能用.htaccess来解决这个问题吗?

我目前拥有的代码是:

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s([^.]+).php
RewriteRule ^ %1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s([^.]+)/'s
RewriteRule ^ %1 [R=301,L]
## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]

试试这些规则:

RewriteEngine On 
## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}'s(.+?)'.php['s?] [NC]
RewriteRule ^ %1 [R=302,L,NE]
## Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [NE,R=302,L]
## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

请记住在测试前清除浏览器缓存。