【问题标题】:redirect to file in subdirectory, if exist there重定向到子目录中的文件(如果存在)
【发布时间】:2012-09-27 13:57:33
【问题描述】:

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

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案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. 应用规则:匹配([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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      相关资源
      最近更新 更多