多个URL重写规则(Pretify)

问题描述:

我有两个类型的网址:我是用这个.htaccess的URL重写多个URL重写规则(Pretify)

http://mydomain.com/npguar/en/products.php
http://mydomain.com/npguar/en/1/product_specification.php

早些时候:

RewriteEngine on 
RewriteCond $1 !^(index\.php|assets|robots\.txt) 
RewriteRule ^([a-z]{2})/(.*) $2?language=$1 [L] 

再后来我修改它对此,但它似乎并不工作

RewriteEngine on 

RewriteCond $1 ^(product_specification\.php) 
RewriteRule ^([a-z]{2})/([0-9]{1,2})(.*) $3?language=$1&id=$2 [L] 

RewriteCond $1 !^(index\.php|assets|robots\.txt|product_specification\.php) 
RewriteRule ^([a-z]{2})/(.*) $2?language=$1 [L] 

原始规则的工作原理如下。开始用URL:

http://mydomain.com/npguar/en/index.php?maybe=a-query 

只拿文件系统路径:

npguar/en/index.php 

除去用于获取到.htaccess前缀:

en/index.php 

匹配这对正则表达式^([a-z]{2})/(.*) 。它匹配,所以处理继续。有子模式的正则表达式,它匹配这样的URL的一部分:

(en)/(index.php) 

这场比赛定义了反向引用$1 = en$2 = index.php

现在检查相应的RewriteCond。第一个参数是$1,它扩展为字符串en。第二个参数是!,以及与该字符串不匹配的正则表达式,因此条件为真。

由于条件为真,回到RewriteRule和构建替换字符串$2?language=$1

index.php?language=en 

这是一个内部重定向,这样就把一部开拓创新的URL的位重新走到一起。由于此处存在查询并且未指定[QSA]标志,因此将替换原始查询(maybe=a-query)。

http://mydomain.com/npguar/index.php?language=en 

该URL从一开始就交给Apache进行处理。再次检查重写规则([L]标志不会阻止此操作),但它们不匹配,并且提供页面。


这个规则的问题是在RewriteCond$1。它应该是$2。那么在上面的例子中RewriteCond将是错误的,但在en/products.php中是正确的。

虽然这工作正常,因为RewriteCond只是比你想的更松。

新规则不起作用,因为正则表达式打破了这样一个URL(注意:其中第二/云):

(en)/(1)(/product_specification.php) 

所以$1 = en$2 = 1,​​。然后它将$1^product_specification.php进行比较,它不匹配,并且条件为假。

相反,新的规则应该是:

RewriteCond $3 ^product_specification\.php$ 
      ^^       ^
RewriteRule ^([a-z]{2})/([0-9]{1,2})/(.*) $3?language=$1&id=$2 [L] 
            ^

(我也是在结尾添加一个$使.../product_specification.phpfoo不匹配。)

同样的规则可以是简单的:

RewriteRule ^([a-z]{2})/([0-9]{1,2})/(product_specification\.php)$ $3?language=$1&id=$2 [L] 
+0

谢谢,它的工作,但你能解释我的查询实际上是错误的吗? – Shishant 2011-02-12 18:22:43