循环遍历单个RewriteRule

时间:2016-01-02 23:01:37

标签: .htaccess

有没有办法在.htaccess中连续重复执行单个RewriteRule?

例如:

RewriteEngine On

# ...

RewriteCond %{QUERY_STRING} (.*?)(?:^|&)q=[^&]*(.*)
RewriteRule (.*) $1?%1%2

# ...

此规则只会在继续执行其他规则之前执行一次。但是,它肯定不止一次匹配:

  

输入:/?a = a& q = q& b = b& q = q& c = c
  预期:/?a = a& b = b& c = c
  实际:/?a = a& b = b& q = q& c = c

最接近这种方式似乎是[N]标志,但只有当规则位于文件的最顶层时,这才有效。不幸的是,如果规则依赖于事先执行的其他规则,这是不可行的。

An answer to a similar question表明这是不可能的,但它从未直接解决过这个问题。

要添加更多上下文,最终目标是基本上编码查询字符串:

RewriteEngine On

# ...

RewriteCond %{REQUEST_URI} ^/folder/(.+)
RewriteRule .? - [E=QUERY:%1,S=1]
RewriteRule .? - [S=2]
# Repeat the next rule as many times as possible
RewriteCond %{ENV:QUERY} (.*?)&(.*)
RewriteRule .? - [E=QUERY:%1\%26%2]
RewriteRule .? /folder?query=%{ENV:QUERY}

# ...

这将产生以下结果:

  

输入:/ folder / a& b& c
  预计:/文件夹?query = a%26b%26c
  实际:/文件夹?query = a%26b& c

2 个答案:

答案 0 :(得分:1)

  

但是,我仍然很好奇是否有一种通用方法可以在.htaccess中连续循环一个规则。

首先,您应该使用此内容在index.php中创建folder/以显示各种PHP变量:

<?php
   phpinfo();
?>

以下是循环规则并通过& using N flag.

替换每个-的通用方法
RewriteEngine On

#   
# your other rules here
#

# recursively replace & by - and build query string
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} ^(?:query=-?(.+))?$
RewriteRule ^(folder)/([^&]+)(?:&(.+))?$ $1/$3?query=%1-$2 [N,NC]

# **will never execute** due to previous rule looping
RewriteRule ^(folder)/(.+)$ $1/?query=$2 [NC,L,R]
  

[N]标志使规则集从顶部重新开始,使用规则集的结果作为起点。 极其谨慎使用,因为它可能导致循环

答案 1 :(得分:0)

至少在这种特定情况下,使用[B] flag似乎有一个简单的答案:

RewriteRule ^/folder/(.+) /folder?query=$1 [B]

但是,我仍然很好奇是否有一般方法在.htaccess中连续循环一个规则。