我的网站root中有一个通用的重写规则,如下所示:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1
适用于将“www.example.com/myAction”等网址重写为“www.example.com/index.php?action=myAction”
这必须保持这样,但我需要从重写中排除子目录(“/ login”)。
所以我试过了:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/login/
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1
但仍然没有运气。我在这里读了几个答案,但是找不到这个缺陷。有任何想法吗?谢谢!
答案 0 :(得分:5)
你有一个额外的斜线。与.htaccess
不同,Virtual Host
不使用前面的斜杠。 /login/
也是一个目录。所以你匹配的不是真正的文件,但可能是真正的目录。因此,如果存在'/ css /',则将其重写为index.php作为请求时的操作。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+) index.php?action=$1
如果它仍然出现意外行为,您可能需要确保不重写现有目录并尝试此操作:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+) index.php?action=$1
我还注意到,由于您正在使用?
查找,因此您只使用发布的示例代码捕获了第一个斜杠(可能),所以在我以前的布局中我显示了代码稍短。要捕获整个URI,您可以使用它:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^(.*) index.php?action=$1
要捕获第二个(和第三个)字符串,您可以执行以下操作:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+)/([^/]+)/([^/]+) index.php?action=$1&page=$2&response=$3
答案 1 :(得分:0)
您所拥有的应该是有效的,但您也可以尝试通过/login/
传递所有请求:
RewriteEngine On
RewriteRule ^login/? - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1