重定向到子目录中的文件,如果存在的话

时间:2012-09-27 13:57:34

标签: .htaccess mod-rewrite url-rewriting

我有一个包含此代码的'.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" )

1 个答案:

答案 0 :(得分: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 - >真
  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,重写引擎循环:
    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. 应用规则:匹配([A-z])([0-9]+)-([^/]*)?$ - > true(匹配/cache/P7-product_number_7.html URI的一部分)
    4. URI被重写为/index.php?type=P&id=7&label=product_number_7.html
  6. 所以你需要在规则的开头添加一个不再重写的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]