重定向未在Apache上重定向

6l7fqoea  于 2023-08-07  发布在  Apache
关注(0)|答案(1)|浏览(192)

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 |

wooyq4lh

wooyq4lh1#

ErrorDocument指令定义了一个 Apache 错误文档。当 Apache 确定存在错误时将提供的文档。
没有显示/404.php响应的4个URL都被第二个RewriteRule指令“成功”写入了details.php。从Apache的Angular 来看,没有404。控制权已经交给details.php,现在由PHP来处理请求并根据需要提供适当的404响应。(PHP无法看到Apache ErrorDocument是什么。
但是,第二个RewriteRule是不正确的(即使不知道应该由它重写的URL)。没有弦端锚(即$),它基本上重写了太多。任何形式为/itinerary/<foo>/<bar><anything>的URL都被重写为details.php?id=<bar>,似乎丢弃了<foo>(第二个路径段)并忽略了<anything>。在不了解更多关于这里发生了什么的信息的情况下,您似乎正在丢弃第二个路径段的事实是奇怪的,并且可能会导致网站出现重复内容的问题。
因此,通过简单地附加一个字符串结束锚:

RewriteRule ^itinerary/([A-Za-z0-9-]+)/([A-Za-z0-9]+)$ details.php?id=$2 [NC,L]

字符串
现在,由于正则表达式不再匹配,因此无法重写示例中的最后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到物理资源)。

相关问题