使用 .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/pagehttp://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 相同,那么这应该作为附加重定向来实现,以删除结尾的斜杠。