Mod_rewrite,第一条规则完美,第二条规则没有

时间:2015-04-22 19:15:19

标签: .htaccess mod-rewrite url-rewriting

我有两个mod_rewrite规则,用于定义类别产品。产品按类别显示,点击产品会显示产品页面:

  1. 这有效:
  2. 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/

    1. 但是,在我的htaccess文件中,我想要进行类似的重写:
    2. 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标记并重新排序规则,问题仍然存在

1 个答案:

答案 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]