重定向不在 Apache 上重定向

问题描述 投票:0回答:1

以下是.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 显示?
域名/我不存在
域名/i-donot-exist-too.php
域名/行程/某事/abc
域名/行程/某事/abc/123
域名/行程/某事/login.php
域名/行程/某事/abc/123/1.php
apache mod-rewrite url-rewriting url-rewrite-module errordocument
1个回答
0
投票

ErrorDocument
指令定义了Apache错误文档。当 Apache 确定存在错误时将提供的文档。

不显示

/404.php
响应的 4 个 URL 均被第二个
details.php
指令“成功”写入
RewriteRule
。从 Apache 的角度来看,不存在 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
(前提是它们不映射到物理资源)。

© www.soinside.com 2019 - 2024. All rights reserved.