0

我有一个包含此代码的“.htaccess”文件:(
它应该重定向名称,如“P7-product_number_7”)

RewriteEngine On
RewriteBase /
# if:
RewriteCond %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f
# then:
RewriteRule ([A-z])([0-9]+)-([^/]*)?$ /cache%{REQUEST_URI}.html [B,L]
# else:
RewriteRule ([A-z])([0-9]+)-([^/]*)?$ index.php?type=$1&id=$2&label=$3 [B,L]

检查文件是否存在(在“缓存”目录中)工作正常,但重定向不起作用。
为什么 ?

我曾尝试使用“ RewriteRule ^(.*)$ /cache/$1.html [L] ”而不是第一个 RewriteRule,但它也没有用。
(如果 HTML 文件不存在(在 /cache/ 中)的重定向工作正常,'.htaccess' 和 'cache/' 目录在 '/var/www' 目录中,所以 %{REQUEST_URI} 是 "/P7 -product_number_7")

4

1 回答 1

1

您的规则正在循环,因为您没有检查 URI 的开头。您可能会注意到label $_GET参数是product_number_7.html.html最后是 。这意味着正在应用第一个规则,然后是规则循环,但第二次第一个条件失败(因为没有P7-product_number_7.html.html)所以第二个规则被应用:

  1. URI =/P7-product_number_7
  2. 条件检查:%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f-> true
  3. 应用规则:匹配([A-z])([0-9]+)-([^/]*)?$-> true
  4. URI重写为/cache/P7-product_number_7.html
  5. 启动 URI /P7-product_number_7!= /cache/P7-product_number_7.html,重写引擎循环:
    1. URI =/cache/P7-product_number_7.html
    2. 条件检查:%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f-> false/cache/cache/P7-product_number_7.html.html不存在)
    3. 应用规则:matches ([A-z])([0-9]+)-([^/]*)?$-> true(匹配 URI 的 /cache/ P7-product_number_7 .html 部分)
    4. URI被重写为/index.php?type=P&id=7&label=product_number_7.html

因此,您要么需要在规则的开头添加一个不再重写的直通:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

或者您可以简单地匹配正则表达式中 URI 的开头:

# need ^ ---v
RewriteRule ^([A-z])([0-9]+)-([^/]*)?$ /cache%{REQUEST_URI}.html [B,L]
# and here -v:
RewriteRule ^([A-z])([0-9]+)-([^/]*)?$ index.php?type=$1&id=$2&label=$3 [B,L]
于 2012-09-27T16:59:01.870 回答