2012-09-27 31 views
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] 

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

我曾尝试使用 “重写规则^(。*)$ /cache/$1.html [L]”,而不是第一个重写规则,但它并没有工作太。
(如果HTML文件不存在(在/ cache /中),重定向工作正常,'.htaccess'和'cache /'目录位于'/ var/www'目录中,因此%{REQUEST_URI}为“/P7-product_number_7“)

回答

1

您的规则正在循环,因为您没有检查URI的开头。您可能会注意到,参数为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 - >真
  3. 应用规则:比赛([A-z])([0-9]+)-([^/]*)?$ - >真
  4. URI改写为/cache/P7-product_number_7.html
  5. 开始URI /P7-product_number_7 = /cache/P7-product_number_7.html,重写工程INE循环:
    1. URI = /cache/P7-product_number_7.html
    2. 条件检查:%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f - >/cache/cache/P7-product_number_7.html.html不存在)
    3. 应用规则:比赛([A-z])([0-9]+)-([^/]*)?$ - >真(在/缓存/ P7-product_number_7匹配URI的 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] 
相关问题