bounty还有6天到期。回答此问题可获得+50声望奖励。Sourav希望引起更多关注此问题。
下面是.htaccess文件的内容
Options All -Indexes
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)? DOMAIN NAME \.in)$ [NC]
RewriteRule .? https://%1%{REQUEST_URI} [R=301,L]
RewriteRule ^itinerary/([A-Za-z0-9-]+)/([A-Za-z0-9]+) details.php?id=$2 [NC,L]
ErrorDocument 404 /404.php
字符串
问题是当我输入一个不存在的URL作为DOMAIN/non-existing时,错误重定向工作得很好,但是当我使用一些重定向到不存在的URL时,问题就来了。错误页面未找到
| 404.php显示?||
| --| ------------ |
| 是的,是的| YES |
| 是的,是的| YES |
| 不需要| NO |
| 不需要| NO |
| 不需要| NO |
| 不需要| NO |
1条答案
按热度按时间wooyq4lh1#
ErrorDocument
指令定义了一个 Apache 错误文档。当 Apache 确定存在错误时将提供的文档。没有显示
/404.php
响应的4个URL都被第二个RewriteRule
指令“成功”写入了details.php
。从Apache的Angular 来看,没有404。控制权已经交给details.php
,现在由PHP来处理请求并根据需要提供适当的404响应。(PHP无法看到ApacheErrorDocument
是什么。但是,第二个
RewriteRule
是不正确的(即使不知道应该由它重写的URL)。没有弦端锚(即$
),它基本上重写了太多。任何形式为/itinerary/<foo>/<bar><anything>
的URL都被重写为details.php?id=<bar>
,似乎丢弃了<foo>
(第二个路径段)并忽略了<anything>
。在不了解更多关于这里发生了什么的信息的情况下,您似乎正在丢弃第二个路径段的事实是奇怪的,并且可能会导致网站出现重复内容的问题。因此,通过简单地附加一个字符串结束锚:
字符串
现在,由于正则表达式不再匹配,因此无法重写示例中的最后3个URL(
/itinerary/something/abc/123
,/itinerary/something/login.php
和/itinerary/something/abc/123/1.php
),因此将提供Apache 404错误文档。但是,
/itinerary/something/abc
(您的第三个示例)仍然会被写入details.php
(因为它与上面的正则表达式匹配),因此Apache 404错误文档不会为此URL提供。您的前两个示例根本不符合上述规则,因此不会发生重写,并提供Apache 404
ErrorDocument
(假设它们不Map到物理资源)。