一个RewriteCond多个RewriteRules

我需要保留所有的用户查询string。

RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^$ index.html?page=home&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^about$ index.html?page=about&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^contact$ index.html?page=contact&%1 

我怎样才能为所有RewriteRules指定RewriteCond?

我不期待单一的通用控制器RewriteRule,因为这是一个小的静态网站。

对于你的三个例子,这些将起作用:

 RewriteRule ^$ index.html?page=home [QSA,L] RewriteRule ^about$ index.html?page=about [QSA,L] RewriteRule ^contact$ index.html?page=contact [QSA,L] 

诀窍是“QSA”的标志。

编辑:一个稍微更一般的解决scheme,这基于Drupal如何做:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.html?page=$1 [L,QSA] 

!-f很重要,否则你不能提供图像或index.html本身。 !-d行可以被删除,具体取决于你在做什么。 稍微不同的方法可能是:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)$ index.html?page=$1 [L,QSA] 

它会抓住/ foo和/ bar,但不是/ foo /,/ bar /或/ foo / bar。

除了可以使用QSA的事实,您是否知道您可以在RewriteRule中正确使用%{QUERY_STRING}

 RewriteRule ^$ index.html?page=home&%{QUERY_STRING} RewriteRule ^about$ index.html?page=about&%{QUERY_STRING} RewriteRule ^contact$ index.html?page=contact&%{QUERY_STRING} 

此方法优于QSA标志的优点是,您可以控制生成的查询string中的参数顺序。 例如:

  RewriteRule ^contact$ index.html?%{QUERY_STRING}&page=contact 

这确保'page'参数始终设置为'contact',即使它已经包含在原始查询string中。 (至lessPHP是这样的,因为PHP的查询stringparsing器总是将多个相同参数的最后一个返回到$ _GET数组中。

一个RewriteCond多个RewriteRules

你的标题意味着另一个可以解决的问题:

您可以使用RewriteRule标志S|skip将多个RewriteRules与单个RewriteCond(或一组RewriteConds)绑定。 以下是一个将Cond应用于三个规则的示例:

 RewriteCond %{HTTP_HOST} !^www.mydomain.com$ [NC] # skip rules if NOT within domain - only way to tie multiple rules to one cond RewriteRule .? - [S=3] RewriteRule ^path1(/.*)$ /otherpath1$1 RewriteRule ^path2(/.*)$ /otherpath2$1 RewriteRule ^path3(/.*)$ /otherpath3$1 

但是这对于原来的问题来说并不是解决scheme,因为对RewriteCond的反向引用(比如你的情况下的%1)在跳过的规则中不起作用。