有没有办法在.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
答案 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中连续循环一个规则。