http重写,但不包括子目录


htaccess-rewriting, but excluding sub-directory

我在我的站点根目录中有一个通用的重写规则,它看起来像这样:

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

可以很好地将url改写为"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

但仍然没有运气。我在SO上读了几个答案,但找不到缺陷。什么好主意吗?谢谢你!

你有一个额外的斜杠。.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

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

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