2015-03-13 134 views

回答

1

解决方案:

RewriteCond %{REQUEST_URI} !page.php$ 
RewriteRule ^(.+)$ /page.php?name=$1 [L] 

说明:

mod_rewrite的RewriteRule有3个参数:

  1. 模式
  2. 换人
  3. 标志

实现为这样:

RewriteRule pattern substitution [flags] 

始于服务器根,请在RewriteRule“模式”参数所请求的URL的路径,并在“取代”参数所需的路径。在这种情况下:

RewriteRule ^(.+)$ /page.php?name=$1 [L] 

如果URL变化,你不希望(或不能)编写规则每一种情况,然后使用正则表达式^(.+)$捕捉动态值,并将其注入到您的替代路径使用RE捕获变量$1。第一组圆括号是$1,第二组是$2等,并且可以嵌套捕获括号。

^(.+)$这个正则表达式可以理解为:在字符串的开头^$一路字符串的结尾,寻找.任何字符+一个或倍和()捕获该值放入一个变量。


问题:

即使我们有标志[L](最后一条规则计算的),mod_rewrite的引擎(幕后)将新建成的请求/page.php?name=somevalue回到通过mod_rewrite的引擎,直到没有规则或者显然,请求没有变化。幸运的是,有一个支持指令来扩展RewriteRule提供的条件性能RewriteCond

mod_rewrite的RewriteCond适用于下一个出现的RewriteRule并且还具有3个参数:

  1. 测试字符串
  2. 条件模式
  3. 标志(可选)

测试字符串可以来自几个来源。通常,与当前请求相关的服务器变量在此用作此情况的主题。

条件模式又是文本或正则表达式,但有一些额外的特殊条件可以评估。详细解释请阅读Apache online mod_rewrite documentation

在这种情况下:RewriteRule ^(.+)$ /page.php?name=$1 [L],我们刚刚取代请求通过了mod_rewrite送回为/page.php?name=somevalue和我们的“无所不包”的规则,因此我们原来的“someValue中”消失,并与我们的新请求的资源page.php更换相匹配。为了防止我们的“全部抓住”捕捉我们的“page.php”请求,让我们使用RewriteCond从规则中排除它。

RewriteCond %{REQUEST_URI} !page.php$ 
RewriteRule ^(.+)$ /page.php?name=$1 [L] 

RewriteCond可以理解为:%{REQUEST_URI}获得所请求的资源,并且做得非常!$结束与page.php。如果这种情况属实,继续下一个条件或规则。如果此条件不成立,请跳过此规则集并继续到下一个规则集。