htaccess中规则的冲突

时间:2011-04-01 15:37:44

标签: php .htaccess mod-rewrite

这是我的htaccess文件

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php #Line 1
RewriteRule ^([a-zA-Z0-9_-]+)$ product.php?name=$1 #Line 2
RewriteRule ^([a-zA-Z0-9_-]+)/$ product.php?name=$1 #Line 3

第1行是删除所有文件的php扩展名 第2行和第3行是这样的,如果您键入website.com/它将转换为website.com/product.php?name=something

现在,我安装了一个博客,其网址为website.com/blog

这干扰了产品。因此,它不会提供web.com/blog,而是转换为website.com/product.php?name=blog,这会产生错误的结果。如何解决这个问题。

1 个答案:

答案 0 :(得分:4)

您可能会发现此问题很有用:Redirect requests only if the file is not found?

# If requested resource exists as a file or directory, skip next two rules
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule (.*) - [S=2]
#
# Requested resource does not exist, do rewrite if it exists in /archive
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d
RewriteRule (.*) /archive/$1 [L]
#
# Else rewrite requests for non-existent resources to /index.php
RewriteRule (.*) /index.php?q=$1 [L]

以下内容也可能有用:How do I ignore a directory in mod_rewrite?

尝试将其放在任何其他规则之前。

RewriteRule ^blog - [L,NC]