多个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]
谢谢,它的工作,但你能解释我的查询实际上是错误的吗? – Shishant 2011-02-12 18:22:43