.htaccess mod_rewrite-如何从重写规则中排除目录


145

我的.htaccess文件中有8行重写规则。我需要从这些规则中排除服务器上的两个物理目录,以便可以访问它们。目前,所有请求都发送到index.php文件。

要排除的目录:“ admin”和“ user”。

因此,不应将http请求:http: //www.domain.com/admin/传递到index.php文件。

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

我认为您在此之后忘记了量词,[^/]因为如果在此处不允许使用纯空格(必须使用进行转义\<space>)。
Gumbo

真正的浓汤,好收成:)。它应该是^([^ /] +)。
开尔文

Answers:


287

在其他规则之前尝试以下规则:

RewriteRule ^(admin|user)($|/) - [L]

这将结束重写过程。


您好Gumbo,您的代码可以在用户类型为domain.com/admin/(带斜杠)的情况下工作,但不能没有。对于这两种情况,您都可以更改吗?谢谢
开尔文

@开尔文:交替($|/)应处理两种情况。
Gumbo

在这里使用RewriteCond代替RewriteRule更好吗?
rineez

7
@rineez RewriteCond始终要求RewriteRule将其附加到。并且将此条件作为否定条件添加RewriteCond到每个条件中RewriteRule可能会非常庞大​​,将单个条件RewriteRule作为退出(在这种情况下应忽略的条件之上)会更优雅。
Gumbo'8

3
@Ergec的意思是“什么都不要更改”。
Gumbo

112

您还可以做一个.htaccess文件,其中包含

RewriteEngine Off

在要从重写中排除的文件夹中(通过树中较高位置的.htaccess文件中的规则)。简单但有效。


18
+1〜.htaccess是分层操作的,因此本地文件夹会覆盖其父文件夹,就像CSS或MVC中的常规层叠一样。
Atari

4
您只需要记住一件事:激活.htaccess文件(设置AllowOverrideNoneapache config中的其他文件)会强制apache在每个请求中搜索.htaccess。因此,如果您经常访问网站/网络服务器,那么文件系统/硬盘访问可能会对性能产生巨大的影响……
bohrsty

通过文件方法验证SSL证书更新的完美建议。无需修改临时目录之外或vhost文件中的任何内容。验证完成后,您只需删除整个文件夹即可。太好了
Countzero

25

添加条件以检查admin目录,例如:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

您好罗布,我在“ RewriteBase /”之后放了这一行,现在我收到“ 500错误-内部服务器错误”
Kelvin 2009年

@Kelvin我编辑了答案,在要应用的每个规则之前添加条件。
罗布

这是唯一对我有实际帮助的人。该接受的答案没有帮助我。
Uwe Keim

5

如果要从规则中删除特定目录(即,要删除目录foo),则可以使用:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

上面的rewriteRule会将所有请求重写到/index.php,不包括对/ foo /的请求

要排除所有现有的指令,您将需要在规则上方使用以下条件:

RewriteCond %{REQUEST_FILENAME} !-d

以下规则

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

将所有内容(目录除外)都重写为/index.php


5

我们使用了以下mod_rewrite规则:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

这会将对网站的所有流量重定向(永久通过301重定向)到http://www.newdomain.com,但对/ test和/ my-folder目录中的资源的请求除外。我们使用(。*)捕获组将用户转移到他们请求的确切资源,然后在新的URL中包含$ 1。注意空间。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.