请求超出 10 的限制

请求超出 10 的限制

我的日志里全是

[Tue Jan 11 10:20:45 2011] [error] [client 99.162.115.123] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: https://www.domain.com/vehicles/Chevrolet/Uplander/2006

问题是,当我启用时,LogLevel debug我们会收到大量错误日志,因为我们的所有流量都是 SSL。据我所知,该文件不再记录这些错误,要么是因为它被埋在 SSL 日志中,我根本找不到它们。

这是我的.htaccess

Options -indexes
RewriteEngine On

RewriteRule ^battery/([^/]+)$ /browser/product?sku=BATTERY+$1&type=battery
RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)/product([0-9]+)$ /browser/index.php?make=$1&model=$2&id=$3&%{QUERY_STRING} [L,NC]

RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)/([0-9]+)$ /browser/product.php?make=$1&model=$2&year=$3&id=$4&%{QUERY_STRING} [L,NC]

RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)$ /store/product/list.php?make=$1&model=$2&year=$3&%{QUERY_STRING} [L,NC]
RewriteRule ^vehicles/([^/]+)/([^/]+)$ /vehicle/make/model/year/list.php?make=$1&model=$2&%{QUERY_STRING} [L,NC]
RewriteRule ^vehicles/([^/]+)$ /vehicle/make/model/list.php?make=$1&%{QUERY_STRING} [L,NC]

答案1

首先:永远不要在生产环境中测试此类事情。安装一个测试服务器并在那里执行一个 HTTP 请求,然后查看日志。您应该能够轻松识别特定于此请求的内容。

在解决与 mod_rewrite 解析循环有关的问题时,此调试数据非常有用。基本上,它会记录执行的每个步骤并打印解析结果。

RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)$ /store/product/list.php?make=$1&model=$2&year=$3&%{QUERY_STRING} [L,NC]

这很可能是您想要的规则。该规则没有生效,解析停止并转到第二条规则:

RewriteRule ^battery/([^/]+)$ /browser/product?sku=BATTERY+$1&type=battery
RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)/product([0-9]+)$ /browser/index.php?make=$1&model=$2&id=$3&%{QUERY_STRING} [L,NC]

由于它有 [L],所以是最后一个条目。替换将在那里停止。RewriteRules 并不关心 URL 是否匹配。

相反使用重写条件进行匹配。如果匹配,则使用该规则,如果不匹配,则继续执行该规则之后的操作。

所以就像

RewriteCond %{REQUEST_URI} ^vehicles/([^/]+)/([^/]+)/([^/]+)$
RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)$ /store/product/list.php?make=$1&model=$2&year=$3&%{QUERY_STRING} [L,NC]

如果您想要更清晰的规则,您还可以使用 RewriteCond 中定义的参数,并使用 %1。

答案2

您可以尝试不加这行吗?

重写规则 ^vehicles/([^/]+)/([^/]+)/([^/]+)/product([0-9]+)$ /browser/index.php?make=$1&model=$2&id=$3&%{QUERY_STRING} [L,NC]

也许它与产品中的额外括号混淆(这只是猜测)

答案3

根据您的重写规则,与您的 URL 匹配的是:

RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)$ /store/product/list.php?make=$1&model=$2&year=$3&%{QUERY_STRING} [L,NC]  

重写如下:

/store/product/list.php?make=Chevrolet&model=Uplander&year=2006&

正如 larsks 和其他人指出的那样,此时,您应该:

通过 RewriteLog 和 RewriteLogLevel 启用重写规则的日志记录。这应该可以帮助您追踪问题。– larsks 1 月 11 日 16:50

这样您将看到正在发生的事情,然后可以在此处发布日志以获得进一步的帮助。

然后请注意,对于访问代码所在目录中或下方的文件的每个 HTTP 请求,都会执行 mod_rewrite 代码,因此这可能是问题的根源。

您可以使用以下代码,测试 URL 是否不以 .php 结尾,如果不是,它将跳过接下来的 6 个 RewriteRules。

RewriteRule !\.php$ - [S=6]
RewriteRule ^battery/([^/]+)$ /browser/product?sku=BATTERY+$1&type=battery
RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)/product([0-9]+)$ /browser/index.php?make=$1&model=$2&id=$3&%{QUERY_STRING} [L,NC]  
RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)/([0-9]+)$ /browser/product.php?make=$1&model=$2&year=$3&id=$4&%{QUERY_STRING} [L,NC]
RewriteRule ^vehicles/([^/]+)/([^/]+)/([^/]+)$ /store/product/list.php?make=$1&model=$2&year=$3&%{QUERY_STRING} [L,NC]
RewriteRule ^vehicles/([^/]+)/([^/]+)$ /vehicle/make/model/year/list.php?make=$1&model=$2&%{QUERY_STRING} [L,NC]
RewriteRule ^vehicles/([^/]+)$ /vehicle/make/model/list.php?make=$1&%{QUERY_STRING} [L,NC]

希望能帮助到你

相关内容