htaccess多用途重写规则冲突

时间:2014-11-06 12:50:11

标签: apache .htaccess mod-rewrite rewrite

我有2个简单的PHP文件:

product.php
product-options.php

在我的htaccess文件中,我有:

RewriteEngine On
RewriteRule ^product$ product.php [L]
RewriteRule ^options$ product-options.php [L]
RewriteRule ^product-([^/]+)/?$ product.php?id=$1 [L]
RewriteRule ^options-([^/]+)/?$ product-options.php?id=$1 [L]

当我打电话给“ mysite.com/product ”或“ mysite.com/product-MYID

时,一切正常

但是当我打电话给“ mysite.com/options ”或“ mysite.com/option-MYID ”时,我看到了正确的网址,但该文件的内容是“product”/“product-MYID”!!!为什么???

PS:我需要两个文件都是可访问的,有没有GET?id = ID

2 个答案:

答案 0 :(得分:1)

这是因为你的规则正在执行第二次,因为正则表达式是:

^product-([^/]+)/?$

哪个匹配/product-MYID URI以及重写的URI:product-options.php

为了避免这种情况,您可以使用以下规则:

RewriteEngine On

# If the request is for a valid directory or file then skip rewrite rules
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^product/?$ product.php [L]
RewriteRule ^options/?$ product-options.php [L]
RewriteRule ^product-([^/]+)/?$ product.php?id=$1 [L,QSA]
RewriteRule ^options-([^/]+)/?$ product-options.php?id=$1 [L,QSA]

答案 1 :(得分:1)

或者您可以使用:

RewriteEngine On
RewriteRule ^product$ product.php [L]
RewriteRule ^options$ product-options.php [L]
RewriteRule ^product-([^/\.]+)/?$ product.php?id=$1 [L]
RewriteRule ^options-([^/\.]+)/?$ product-options.php?id=$1 [L]

因为,我认为,你不使用。在您的产品-...或选项-...