2009-12-04 77 views
117

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

目录排除: “admin” 和 “用户”。

所以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] 
+0

我觉得你忘记了'[^ /]'后面的量词,因为如果不允许的话就有一个简单的空格(它必须用'\ '转义)。 – Gumbo 2009-12-04 17:54:07

+0

True Gumbo,很好赶:)。它应该是^([^ /] +)。 – Kelvin 2009-12-04 21:02:04

回答

233

你的其他规则之前尝试此规则:

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

这将结束改写过程。

+0

Hello Gumbo,如果用户键入domain.com/admin/(结尾斜杠),但没有它,则代码起作用。你有什么可以改变这两种情况下工作?谢谢 – Kelvin 2009-12-04 20:52:52

+0

@Kelvin:交替'($ | /)'应该处理这两种情况。 – Gumbo 2009-12-04 21:56:26

+0

在这里使用RewriteCond而不是RewriteRule更好吗? – rineez 2012-08-14 03:04:51

18

添加一个条件来检查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] 
+0

Hello Rob,我把这行写在“RewriteBase /”之后,现在我得到了“500错误 - 内部服务器错误” – Kelvin 2009-12-04 17:42:31

+0

@Kelvin我编辑了我的答案,在每个想要应用它的规则之前添加条件。 – Rob 2009-12-04 17:48:52

84

,你也可以做的就是把什么含

RewriteEngine Off 

在要被重写排除的文件夹.htaccess文件(由.htaccess文件,在树的上涨规则)。简单但有效。

+16

+1〜.htaccess分层操作,所以本地文件夹覆盖父母,就像CSS或MVC中的正常级联一样。 – Atari 2013-10-30 18:12:51

+10

该死的,我希望我能在十年前了解到这一点...... – Rob 2014-08-28 01:39:57

+6

迄今为止最好的解决方案。谢谢 – Dpedrinha 2016-02-19 04:57:09

4
RewriteEngine On 

RewriteRule ^(wordpress)($|/) - [L] 
3

我们使用以下的mod_rewrite规则:!

RewriteEngine叙述上
的RewriteCond%{REQUEST_URI}^/测试/
的RewriteCond%{REQUEST_URI}^/我的文件夹/
重写规则(。*)http://www.newdomain.com/ $ 1 [R = 301,L]

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

2

如果你想从规则中删除一个特定的目录(意思是,你要删除的目录FOO),你可以使用:

RewriteEngine on 

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

的重写规则上面会重写所有requestes到/index.php不包括/foo/的请求。

要排除所有存在directries,您需要使用您的规则和以下的条件:

RewriteCond %{REQUEST_FILENAME} !-d 

以下规则

RewriteEngine on 

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

重写一切(除了directries)到/索引。 php