使用 .htaccess 删除文件扩展名会导致错误
Removing file extensions using .htaccess causes errors
今天早些时候,当人们使用 .htaccess
访问我的网站时,我试图删除 php
文件扩展名。 (有点像 https://tecadmin.net/remove-file-extension-from-url-using-htaccess/)
下面是我的 .htaccess
文件:
#Remove php file extensions
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .php [NC,L]
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
代码似乎正在执行它的工作,但我很快注意到一个问题。 http://example.com/page
和 http://example.com/page.php
工作得很好,但是当我访问 http://example.com/page/
时,服务器 returns 出现内部服务器错误。 (500)
我尝试在网上查找如何解决此问题,但一无所获。有谁知道如何解决这个问题?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .php [NC,L]
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
您的第一条和最后一条规则做的是同一类事情(通过内部重写附加 .php
扩展名),但是,它们的做法略有不同,而且可以说是不正确的。你当然不需要两者。
请求 /page/
时的 500 错误是由重写循环引起的。第一条规则将请求重写为 /page/.php
。然后 last 规则将请求第二次重写为 /page/.php.php
然后再次重写为 /page/.php.php.php
等等。因为 REQUEST_FILENAME
是 /page
在所有情况下,因此 %{REQUEST_FILENAME}.php
(在 条件下 )不一定与 %{REQUEST_URI}.php
(URL 被重写为)相同。
请尝试以下操作:
Options -MultiViews
RewriteEngine On
# Remove php file extensions
RewriteCond %{THE_REQUEST} \s/([^.]+)\.php [NC]
RewriteRule ^ /%1 [R=301,L]
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^([^.]+)$ .php [L]
删除 .php
扩展的重定向可能应该是 301(永久)重定向,一旦您确认它按预期工作。
RewriteRule
指令中的 NC
标志是多余的。
在正则表达式字符中使用时,无需反斜杠转义文字点 class。这些点在这里没有特殊意义。因此,[^.]
与 [^\.]
相同。 (虽然你逃脱了一个而不是另一个。)
这现在检查在 RewriteRule
substitution 字符串中重写的同一个文件 %{DOCUMENT_ROOT}/.php
,即。 .php
.
注意:我已明确禁用 MultiViews 以确保这些指令不会被 mod_negotiation 覆盖。
这将导致请求 /page/
(带有尾部斜线)的 404。如果这应该 return 与 /page
相同,那么这应该作为附加重定向来实现,以删除结尾的斜杠。
今天早些时候,当人们使用 .htaccess
访问我的网站时,我试图删除 php
文件扩展名。 (有点像 https://tecadmin.net/remove-file-extension-from-url-using-htaccess/)
下面是我的 .htaccess
文件:
#Remove php file extensions
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .php [NC,L]
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
代码似乎正在执行它的工作,但我很快注意到一个问题。 http://example.com/page
和 http://example.com/page.php
工作得很好,但是当我访问 http://example.com/page/
时,服务器 returns 出现内部服务器错误。 (500)
我尝试在网上查找如何解决此问题,但一无所获。有谁知道如何解决这个问题?
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ .php [NC,L] RewriteEngine on RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [NC,L]
您的第一条和最后一条规则做的是同一类事情(通过内部重写附加 .php
扩展名),但是,它们的做法略有不同,而且可以说是不正确的。你当然不需要两者。
请求 /page/
时的 500 错误是由重写循环引起的。第一条规则将请求重写为 /page/.php
。然后 last 规则将请求第二次重写为 /page/.php.php
然后再次重写为 /page/.php.php.php
等等。因为 REQUEST_FILENAME
是 /page
在所有情况下,因此 %{REQUEST_FILENAME}.php
(在 条件下 )不一定与 %{REQUEST_URI}.php
(URL 被重写为)相同。
请尝试以下操作:
Options -MultiViews
RewriteEngine On
# Remove php file extensions
RewriteCond %{THE_REQUEST} \s/([^.]+)\.php [NC]
RewriteRule ^ /%1 [R=301,L]
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^([^.]+)$ .php [L]
删除 .php
扩展的重定向可能应该是 301(永久)重定向,一旦您确认它按预期工作。
RewriteRule
指令中的 NC
标志是多余的。
在正则表达式字符中使用时,无需反斜杠转义文字点 class。这些点在这里没有特殊意义。因此,[^.]
与 [^\.]
相同。 (虽然你逃脱了一个而不是另一个。)
这现在检查在 RewriteRule
substitution 字符串中重写的同一个文件 %{DOCUMENT_ROOT}/.php
,即。 .php
.
注意:我已明确禁用 MultiViews 以确保这些指令不会被 mod_negotiation 覆盖。
这将导致请求 /page/
(带有尾部斜线)的 404。如果这应该 return 与 /page
相同,那么这应该作为附加重定向来实现,以删除结尾的斜杠。