错误文档404 .htaccess无法使用重写规则

zdwk9cvp  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(144)

.htaccessErrorDocument 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>
3wabscal

3wabscal1#

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

这个规则的“问题”是,如果您请求一个不存在的文件,并且该文件也不存在于/stores/子目录中,那么它将导致无休止的重写循环(因此您将看到500内部服务器错误),因为它将尝试如下重写:

  • /not-exists(初始请求)
  • /stores/not-exists(第1次重写)
  • /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

相关问题