找出htaccess规则以及它们无法正常工作的原因有点帮助

时间:2012-01-27 02:13:12

标签: php .htaccess

我有这些规则,我无法弄清楚为什么其中一条不起作用:

RewriteEngine On
RewriteBase /

Options +FollowSymlinks
Options -MultiViews
Options -Indexes

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#RewriteRule ^error/([^/.]+)/([^/.]+)$ /pages/error.php?$1=$2 [NC,R]
RewriteRule ^([^/.]+)$ index.php?user=$1 [NC,L]
RewriteRule ^([^/.]+)/.* index.php?$0 [PT]
RewriteRule ^error/.* error.php/?$0 [PT]

规则1有效,echo $_GET['user']然后我得到结果

规则2也适用。如果我做了print_r($_SERVER['REQUEST_URI']),那么我会得到.com/之后的内容。

所以这让我认为它正确地捕捉,如果我也这样做。

所以这些规则似乎正在起作用......但现在如果我进入

domain.com/error/access/notallowed然后我收到Not Found错误,这意味着我的规则3想要抓住任何以error开头的内容无效。

关于可能导致此行为的任何想法?

编辑:根据答案更新规则

RewriteRule ^([^/.]+)$ index.php?user=$1 [NC,L]
RewriteCond %{REQUEST_URI} ^/error/?
RewriteRule ^([^/.]+)/?.* index.php?$1 [PT]
RewriteRule ^(error/?.*)$ /_msp/pages/error.php/?$1

2 个答案:

答案 0 :(得分:2)

问题是你的第二个RewriteRule在apache能够进入第三个RewriteRule之前捕获domain.com/error/access/notallowed。所以,apache说,“我有一个匹配的规则,我已经完成了,”并抛弃了其余的RewriteRules。如果只有一种方法我们可以告诉apache在特定情况下忽略第二条规则......

向RewriteCond问好

“等等,你是说我认为你在说什么?我可以告诉apache忽略第二条规则吗?”

“是的,这正是我所说的。”

RewriteRule ^([^/.]+)$ index.php?user=$1 [NC,L]
RewriteCond %{REQUEST_URI} !^/error/?
RewriteRule ^([^/.]+)/?.* index.php?$1 [PT]
RewriteRule ^(error/.*)$ index.php?$1 [PT]

在第二条规则之前看到 RewriteCond 一行?您可以插入任意数量的条件,它们将应用于下一个评估的规则。所以,在这个特定的RewriteCond中,我们告诉apache如果REQUEST_URI以/error/开头,则不应使用以下规则。

使用上述地址domain.com/error/access/notallowed规则的重写网址将为:

index.php/?error/access/notallowed

您可以根据需要调整正则表达式。

答案 1 :(得分:0)

我相信如果你切换最后两个它应该有效:

RewriteRule ^error/.* error.php/?$0 [PT]
RewriteRule ^([^/.]+)/.* index.php?$0 [PT]

RewriteRule ^([^ /。] +)/.* index.php?$ 0 [PT]规则匹配url,我相信重写它并将其作为index.php传递,但我不是htaccess专家。