.htaccess 重定向到子目录中的文件(如果存在)

.htaccess 重定向到子目录中的文件(如果存在),.htaccess,mod-rewrite,url-rewriting,.htaccess,Mod Rewrite,Url Rewriting,我有一个包含以下代码的“.htaccess”文件: (它应该重定向名称,如“P7-product_number_7”) 检查文件(在“缓存”目录中)的现有路径可以正常工作,但重定向不起作用。 为什么? 我曾尝试使用“重写规则^(.*)$/cache/$1.html[L]”代替第一个重写规则,但它也不起作用。 (如果HTML文件不存在(在/cache/中),重定向工作正常,“.htaccess”和“cache/”目录在“/var/www”目录中,因此%{REQUEST\u URI}是“/P7-pr

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

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

我曾尝试使用“重写规则^(.*)$/cache/$1.html[L]”代替第一个重写规则,但它也不起作用。

(如果HTML文件不存在(在/cache/中),重定向工作正常,“.htaccess”和“cache/”目录在“/var/www”目录中,因此%{REQUEST\u URI}是“/P7-product\u number\u 7”)

您的规则正在循环,因为您没有检查URI的开头。您可能会注意到,
标签
$\u GET参数是产品编号_7.html,最后是
.html
。这意味着应用第一条规则,然后规则循环,但第二次第一个条件失败(因为没有
P7-product_number_7.html.html
),因此应用第二条规则:

  • URI=
    /P7-product\u number\u 7
  • 条件检查:
    %{DOCUMENT\u ROOT}/cache%{REQUEST\u URI}.html-f
    ->true
  • 应用规则:匹配
    ([A-z])([0-9]+)-([^/]*)?$
    ->true
  • URI重写为
    /cache/P7-product\u number\u 7.html
  • 开始URI
    /P7-product\u number\u 7
    !=<代码>/cache/P7-product_number_7.html,重写引擎循环:
  • URI=
    /cache/P7-product\u number\u 7.html
  • 条件检查:
    %{DOCUMENT\u ROOT}/cache%{REQUEST\u URI}.html-f
    ->false
    /cache/cache/P7-product\u number\u 7.html.html
    不存在)
  • 应用规则:匹配
    ([A-z])([0-9]+)-([^/]*)?$
    ->true(匹配URI的/cache/P7-product\u number\u 7.html部分)
  • URI被重写为
    /index.php?type=P&id=7&label=product\u number\u 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]
    
    # 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]