重写与现有文件冲突的规则

时间:2013-08-13 06:53:58

标签: .htaccess url-rewriting

我遇到了一些与现有网址冲突的htaccess网址重写规则。

  1. 将我的类别页面写入www.mydomain.com/categoryname.html

    我正在使用以下规则工作正常但我的所有其他网页(如www.mydomain.com/about.html)显示404未找到

    RewriteRule ^([^/]*)\.html$ /category_parent.php?ctg=$1 [L]
    
  2. 编写我的产品页面,例如www.mydomain.com/25/productname.html

    我正在使用以下代码也正常工作

    RewriteRule ^([^/]*)/([^/]*)\.html$ /product.php?id=$1&url=$2 [L]
    

    但是上面的重写规则与我正在使用以下代码的子类别页面冲突:

    RewriteRule ^([^/]*)/([^/]*)\.html$ /category_child.php?pctg=$1&ctg=$2 [L]
    
  3. 简而言之,我想写信给,

    www.mydomain.com/categoryname.html
    
    www.mydomain.com/categoryname/subcategoryname.html
    
    www.mydomain.com/25/productname.html
    

    但有些规则相互搞乱。如果你能为我提供一些线索,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您的文件与不存在的文件发生冲突,则应使用条件来验证文件,目录或符号链接是否存在。

对于文件:

RewriteCond %{REQUEST_FILENAME} !-f

对于文件夹:

RewriteCond %{REQUEST_FILENAME} !-d

对于符号链接:

RewriteCond %{REQUEST_FILENAME} !-l

感叹号!用于否定其含义!-f表示如果文件不存在则应用规则(如果存在)则不应用规则。

请注意,RewriteCond后面应跟RewriteRuleRewriteRule可以有一个或多个条件,例如:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^([^/]*)\.html$ /category_parent.php?ctg=$1 [L]

在这种情况下,它意味着如果目录不存在且文件不存在且符号链接不存在,那么我们重定向但如果存在任何先前条件,则我们不会重定向。