".htaccess中的ErrorDocument 404与RewriteRule不兼容导致功能失效"
P粉320361201
P粉320361201 2024-01-10 16:56:14
[PHP讨论组]

.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/$1  [NC,L]
   ErrorDocument 404 /404.html
  </IfModule>

P粉320361201
P粉320361201

全部回复(1)
P粉605233764

这个规则的“问题”是,如果你请求一个不存在的文件,并且该文件在/subdirectory/子目录中也不存在,那么它会导致无限重写循环(因此你看到的是500 Internal Server Error),因为它会尝试进行以下重写:

  • /not-exists(初始请求)
  • /stores/not-exists(第一次重写)
  • /stores/stores/not-exists(第二次重写)
  • /stores/stores/stores/not-exists(第三次重写)
  • 等等。

你实际上没有说明你想要实现什么,但我假设/stores是一个“隐藏”的子目录,你打算重写到/stores子目录中的实际文件。这是唯一的方式,这样的规则才能与在Apache中定义的ErrorDocument 404指令一起工作。

因此,在重写到/stores子目录时,你需要首先检查请求是否会映射到一个实际的文件,然后再发出重写。这样,任何不存在且不映射到/stores子目录中的文件的请求都会被传递到Apache定义的404 ErrorDocument。

例如,尝试使用以下代码:

ErrorDocument 404 /404.html

RewriteEngine On 

# 如果该目录中存在文件,则将请求重写到“/stores”目录
RewriteCond %{DOCUMENT_ROOT}/stores/$1 -f
RewriteRule (.+) stores/$1 [L]

# (可选)将根目录的请求重写为“/stores/”
RewriteRule ^$ stores/ [L]

不需要<IfModule>容器(但你将RewriteEngine指令放在了这个容器外面,这样做毫无意义)。

如果.htaccess文件位于文档根目录中,则不需要RewriteBase指令。

在结构上,最好先定义ErrorDocument。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号