[英]ErrorDocument 404 .htaccess not working with RewriteRule
当我使用重写规则时, .htaccess
ErrorDocument 404
页面未重定向。 收到 500 内部服务器错误。
没有RewriteRule
的ErrorDocument
工作正常。
我的代码
RewriteEngine On
<IfModule mod_rewrite.c>
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /stores/$1 [NC,L]
ErrorDocument 404 /404.html
</IfModule>
RewriteCond %{REQUEST_FILENAME}.-f RewriteCond %{REQUEST_FILENAME},-d RewriteRule ^(.*)$ /stores/$1 [NC,L]
此规则的“问题”是,如果您请求一个不存在的文件并且该文件在/stores/
子目录中也不存在,那么它将导致无限的重写循环(因此 500 Internal Server Error 你正在看到),因为它会尝试重写如下:
/not-exists
(初始请求)/stores/not-exists
(第一次重写)/stores/stores/not-exists
(第二遍)/stores/stores/stores/not-exists
(第三遍)您实际上并未在此处说明您要实现的目标,但我假设/stores
是一个“隐藏”子目录,并且您打算重写为/stores
子目录中的实际文件。 这是此类规则与 Apache 中定义的ErrorDocument 404
指令一起使用的唯一方法。
因此,在重写/stores
子目录时,您需要先检查请求是否会 map 到实际文件,然后再发出重写。 这样,任何不存在且不 map 到/stores
子目录中的文件的请求都将传递到 Apache 定义的 404 ErrorDocument
。
例如,请尝试以下操作:
ErrorDocument 404 /404.html
RewriteEngine On
# Rewrite request to "/stores" directory if file exists in that directory
RewriteCond %{DOCUMENT_ROOT}/stores/$1 -f
RewriteRule (.+) stores/$1 [L]
# (OPTIONAL) Rewrite requests for root to "/stores/"
RewriteRule ^$ stores/ [L]
<IfModule>
容器不是必需的(但是您在此容器之外有RewriteEngine
指令 - 无论如何这都失败了)。
如果.htaccess
文件位于文档根目录中,则此处不需要RewriteBase
指令。
首先定义ErrorDocument
在结构上会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.