1

我的站点根目录中有一个通用的重写规则,如下所示:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1

这适用于将“www.example.com/myAction”之类的 URL 重写为“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

但仍然没有运气。我已经在 SO 上阅读了几个答案,但找不到缺陷。有任何想法吗?谢谢!

4

2 回答 2

5

你有一个额外的斜线。.htaccess不像 a 那样使用前面的斜线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
于 2013-05-04T10:38:39.040 回答
0

您所拥有的应该可以工作,但您也可以尝试让所有请求都/login/通过:

RewriteEngine On

RewriteRule ^login/? - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1
于 2013-05-04T10:34:34.667 回答