我有两个mod_rewrite规则,用于定义类别和产品。产品按类别显示,点击产品会显示产品页面:
http://www.example.com/ELE/electricalgoods/
这需要代码值" ELE"并将其与重写一起使用以实际调用/view_category.php?cat=ELE
。这很好用,使用以下mod_rewrite:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /show_category.php?catcode=$1&page=$3 [NC]
(这还包括另一个"文件夹"用于类别视图中的页面,例如http://www.example.com/ELE/electricalgoods/3/
)
http://www.example.com/product/EL063/Earphones/
重写为:/view_product.php?prodid=EL063
我用这个htaccess代码做了这个:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^product/([^/]*)/([^/]*)$ /show_product.php?prodid=$1 [NC,L]
但不知何故,这并没有按预期工作,我希望产品出现在&#34;产品/&#34;具有"/product/<code>/<name>/"
布局的文件夹,并调用/show_product.php
文件。
对view_product.php
页面的调用失败,发生404错误。
我尝试重新安排我的mod_rewrite规则,并且我还尝试了在URL调用的product/
段的括号中进行转义/扩展的变体。
我还尝试将$1
更改为$2
或$3
,但代码的顺序已更改,但似乎无法正常工作。
我做错了什么?
为清楚起见,这是我的完整htaccess代码:
Options -Indexes
RewriteEngine On
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^product/([^/]*)/([^/]*)$ /show_product.php?prodid=$1 [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /view_category.php?catcode=$1&page=$3 [NC,L]
修改:更新了mod_rewrite代码,即使使用L
标记并重新排序规则,问题仍然存在
答案 0 :(得分:1)
那是因为它总是匹配第一个规则([^/]*)/([^/]*)/([^/]*)
。因为这几乎说明了3个目录的组合。您需要更改订单。并在结束时添加L标志,以便在满足该规则后停止处理。
Options -Indexes
RewriteEngine On
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^product/([^/]*)/([^/]*)/?$ /show_product.php?prodid=$1 [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/?$ /view_category.php?catcode=$1&page=$3 [NC,L]