繁体   English   中英

ErrorDocument 404 .htaccess 不能与 RewriteRule 一起使用

[英]ErrorDocument 404 .htaccess not working with RewriteRule

当我使用重写规则时, .htaccess ErrorDocument 404页面未重定向。 收到 500 内部服务器错误。

没有RewriteRuleErrorDocument工作正常。

我的代码

   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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM