htaccess-rewriting,但不包括子目录

时间:2013-05-04 10:13:57

标签: php apache .htaccess

我的网站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

但仍然没有运气。我在这里读了几个答案,但是找不到这个缺陷。有任何想法吗?谢谢!

2 个答案:

答案 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