.htaccess 显示 500 内部服务器错误而不是预期的 404 错误
.htaccess displays 500 internal server error instead of expected 404 error
我的 .htacces 代码有问题,因为它会产生 500 内部服务器错误而不是 404 错误,就像它应该的那样。
500 内部错误仅在我尝试打开目录中的页面时才会导致,该目录实际上是一个文件。例如,在我网站的根目录中,有文件biography.php
。 https://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]
我的 .htacces 代码有问题,因为它会产生 500 内部服务器错误而不是 404 错误,就像它应该的那样。
500 内部错误仅在我尝试打开目录中的页面时才会导致,该目录实际上是一个文件。例如,在我网站的根目录中,有文件biography.php
。 https://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]