我有这些规则,我无法弄清楚为什么其中一条不起作用:
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
答案 0 :(得分:2)
问题是你的第二个RewriteRule在apache能够进入第三个RewriteRule之前捕获domain.com/error/access/notallowed
。所以,apache说,“我有一个匹配的规则,我已经完成了,”并抛弃了其余的RewriteRules。如果只有一种方法我们可以告诉apache在特定情况下忽略第二条规则......
“等等,你是说我认为你在说什么?我可以告诉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专家。