我有一个包含此代码的'.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]
检查文件的现有(在'cache'目录中)工作正常,但重定向不起作用。
为什么?
我尝试使用“ RewriteRule ^(。*)$ / cache / $ 1.html [L] ”而不是第一个RewriteRule,但它也没有用。
(如果HTML文件不存在(在/ cache /中),重定向工作正常,'。htaccess'和'cache /'目录在'/ var / www'目录中,所以%{REQUEST_URI}是“/ P7 -product_number_7" )
答案 0 :(得分:1)
您的规则正在循环,因为您没有检查URI的开头。您可能会注意到label
$ _ GET 参数是 product_number_7.html ,最后是.html
。这意味着第一个规则正在应用,然后规则循环,但第二个条件第二次失败(因为没有P7-product_number_7.html.html
)所以第二个规则被应用:
/P7-product_number_7
%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f
- >真([A-z])([0-9]+)-([^/]*)?$
- >真/cache/P7-product_number_7.html
/P7-product_number_7
!= /cache/P7-product_number_7.html
,重写引擎循环:
/cache/P7-product_number_7.html
%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f
- > false (/cache/cache/P7-product_number_7.html.html
不存在)([A-z])([0-9]+)-([^/]*)?$
- > true(匹配/cache/P7-product_number_7.html URI的一部分)/index.php?type=P&id=7&label=product_number_7.html
所以你需要在规则的开头添加一个不再重写的passthrough:
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]