我的日志里全是
[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]
希望能帮助到你