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

Kel*_*vin 138 .htaccess mod-rewrite url-rewriting

我的.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]
Run Code Online (Sandbox Code Playgroud)

Gum*_*mbo 274

在其他规则之前尝试此规则:

RewriteRule ^(admin|user)($|/) - [L]
Run Code Online (Sandbox Code Playgroud)

这将结束重写过程.

  • @rineez`RewriteCond`总是要求它附加一个`RewriteRule`.并且将这个条件作为一个否定的`RewriteCond`添加到每个`RewriteRule`可能是相当笨重的,单个`RewriteRule`作为一个退出,在这种情况下应该被忽略的那个更优雅. (6认同)
  • @Ergec这意味着"不要改变任何东西". (3认同)

小智 100

你还可以做一个包含的.htaccess文件

RewriteEngine Off
Run Code Online (Sandbox Code Playgroud)

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

  • +1~.htaccess按层次结构运行,因此本地文件夹会覆盖其父项,就像CSS或MVC中的普通级联一样. (17认同)
  • 你应该记住的只有一件事:激活.htaccess文件(在apache配置中设置`AllowOverride`除了'None`之外的任何东西)强制apache在每个请求上搜索.htaccess.因此,如果您有一个高频率的网站/网络服务器,文件系统/硬盘访问可能会产生巨大的性能影响...... (3认同)

Rob*_*Rob 23

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

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]
Run Code Online (Sandbox Code Playgroud)


小智 5

RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
Run Code Online (Sandbox Code Playgroud)


小智 5

我们使用了以下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。注意空间。


sta*_*een 5

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

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]
Run Code Online (Sandbox Code Playgroud)

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

要排除所有现有目录,您需要在规则上方使用以下条件:

RewriteCond %{REQUEST_FILENAME} !-d
Run Code Online (Sandbox Code Playgroud)

以下规则

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]
Run Code Online (Sandbox Code Playgroud)

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