【问题标题】:Mod_rewrite, first rule works perfectly, second rule does notMod_rewrite,第一条规则完美运行,第二条规则没有
【发布时间】:2015-04-22 19:15:18
【问题描述】:

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

  1. 这行得通:

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 文件的下面,我想进行类似的重写:

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]

但不知何故,这并没有按预期工作,我希望产品以"/product/<code>/<name>/" 布局出现在“product/”文件夹中,并调用/show_product.php 文件。

发生的情况是调用 view_product.php 页面失败并出现 404 错误。

我已经尝试重新排列我的 mod_rewrite 规则,并且我还尝试了在 URL 调用的 product/ 段的括号中转义/ancasing 的变体。 我还尝试将$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 标志和重新排序规则,问题仍然存在

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多