.htaccess
ErrorDocument 404
在使用重写规则时没有重定向。出现500 Internal Server Error。
没有 RewriteRule
时,ErrorDocument
正常工作。
我的代码
RewriteEngine On <IfModule mod_rewrite.c> RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /stores/ [NC,L] ErrorDocument 404 /404.html </IfModule>
P粉6052337642024-01-11 09:26:16
这个规则的“问题”是,如果你请求一个不存在的文件,并且该文件在/subdirectory/子目录中也不存在,那么它会导致无限重写循环(因此你看到的是500 Internal Server Error),因为它会尝试进行以下重写:
你实际上没有说明你想要实现什么,但我假设/stores是一个“隐藏”的子目录,你打算重写到/stores子目录中的实际文件。这是唯一的方式,这样的规则才能与在Apache中定义的ErrorDocument 404指令一起工作。
因此,在重写到/stores子目录时,你需要首先检查请求是否会映射到一个实际的文件,然后再发出重写。这样,任何不存在且不映射到/stores子目录中的文件的请求都会被传递到Apache定义的404 ErrorDocument。
例如,尝试使用以下代码:
ErrorDocument 404 /404.html RewriteEngine On # 如果该目录中存在文件,则将请求重写到“/stores”目录 RewriteCond %{DOCUMENT_ROOT}/stores/ -f RewriteRule (.+) stores/ [L] # (可选)将根目录的请求重写为“/stores/” RewriteRule ^$ stores/ [L]
不需要<IfModule>
容器(但你将RewriteEngine指令放在了这个容器外面,这样做毫无意义)。
如果.htaccess文件位于文档根目录中,则不需要RewriteBase指令。
在结构上,最好先定义ErrorDocument。