.htaccess 显示 500 内部服务器错误而不是预期的 404 错误

.htaccess displays 500 internal server error instead of expected 404 error

我的 .htacces 代码有问题,因为它会产生 500 内部服务器错误而不是 404 错误,就像它应该的那样。

500 内部错误仅在我尝试打开目录中的页面时才会导致,该目录实际上是一个文件。例如,在我网站的根目录中,有文件biography.phphttps://example.com/biography.php 重定向到 https://example.com/biography/.

但是当我尝试打开不存在的页面时 https://example.com/biography/test/,它显示 500 内部服务器错误而不是预期的 404 错误。

这是我的 .htacces 代码。最后 6 行似乎导致了问题,因为没有它们,将显示预期的 404 错误而不是 500 内部服务器错误。但是没有它们,https://example.com/biography.php 不会重定向到 https://example.com/biography/

也许有一个重定向循环或类似的东西?我只是从网上复制代码,所以我无法自己解决问题。

Options -Indexes
AddDefaultCharset UTF-8
ServerSignature Off
DirectoryIndex index.php

RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !(^$|\.[a-zA-Z0-9]{1,5}|/)$ %{REQUEST_URI}/ [R=301,L]

RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^((/?[^/]+){1,2})/$ .php [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ .php [NC,L]

感谢您的帮助!我希望你能理解我的问题!我很感激! :)

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ .php [NC,L]

重写循环(导致 500 错误)是由最后一条规则(3 个指令)引起的,因为检查 %{REQUEST_FILENAME}.php -f 的条件不一定检查您正在重写的同一文件RewriteRule 替换 字符串(即.php)。

当您请求 /biography/test/ 时,您最终会检查 /biography.php 是否存在(确实存在),但您最终会将请求重写为 /biography/test.php(不存在)-这会导致重写循环。

my answer to the following question on ServerFault for a more detailed explanation: https://serverfault.com/questions/989333/using-apache-rewrite-rules-in-htaccess-to-remove-html-causing-a-500-error

最后一条规则应该这样写:

# Rewrite to append the ".php" extension as required.
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^(.*?)/?$ .php [L]

这现在会在将 .php 扩展名附加到 相同的 URL-path.

之前检查目标文件是否存在

不需要两个条件。这里不需要 NC 标志。

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301]

但是,您重定向到 删除 .php 扩展名也不完全正确。如果它出现在 URL 的查询字符串部分,这也会错误地删除 .php“扩展名”。而且您缺少 L 标志。您也不需要同时满足 条件 .

改用如下内容:

# Remove ".php" extension from requested URL-path
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.+)\.php$ / [R=301,L]

总结

# Remove ".php" extension from requested URL-path
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.+)\.php$ / [R=301,L]

# Rewrite to append the ".php" extension as required.
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^(.*?)/?$ .php [L]