htaccess-rewriting,但不包括子目录

Rap*_*ger 1 php apache .htaccess

我在我的网站root中有一个通用的重写规则,如下所示:

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

适用于将"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
Run Code Online (Sandbox Code Playgroud)

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

Abs*_*ERØ 5

你有一个额外的斜线..htaccess不使用前面的斜杠Virtual Host.也是/login/一个目录.所以你匹配的不是真正的文件,但可能是真正的目录.因此,如果存在'/ css /',则将其重写为index.php作为请求时的操作.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+) index.php?action=$1
Run Code Online (Sandbox Code Playgroud)

如果它仍然意外地执行,您可能需要确保不重写现有目录并尝试这样做:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+) index.php?action=$1
Run Code Online (Sandbox Code Playgroud)

我还注意到你只使用你发布的示例代码捕获了第一个斜杠(可能),因为你正在使用?查找,所以在我以前的布局中我显示的代码有点短.要捕获整个URI,您可以使用:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^(.*) index.php?action=$1
Run Code Online (Sandbox Code Playgroud)

要捕获第二个(和第三个)字符串,您可以执行以下操作:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^login/
RewriteRule ^([^/]+)/([^/]+)/([^/]+) index.php?action=$1&page=$2&response=$3
Run Code Online (Sandbox Code Playgroud)