【问题标题】:.htaccess mod_rewrite - how to exclude directory from rewrite rule.htaccess mod_rewrite - 如何从重写规则中排除目录
【发布时间】:2010-12-23 08:09:18
【问题描述】:

我的 .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> 转义)。
  • 真正的秋葵汤,好收获:)。它应该是 ^([^/]+)。

标签: .htaccess mod-rewrite url-rewriting


【解决方案1】:

在你的其他规则之前尝试这条规则:

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

这将结束重写过程。

【讨论】:

  • 您好 Gumbo,如果用户键入 domain.com/admin/(带有斜线结尾),您的代码可以工作,但没有它就不行。你有什么可以改变的,这两种情况都可以工作吗?谢谢
  • @Kelvin:交替的($|/) 应该处理这两种情况。
  • 这里用 RewriteCond 代替 RewriteRule 不是更好吗?
  • @rineez RewriteCond 总是需要一个 RewriteRule 来连接它。并且将此条件作为否定的RewriteCond 添加到每个RewriteRule 可能会非常庞大​​,单个RewriteRule 作为在这种情况下应该忽略的出口上方的出口更为优雅。
  • @Ergec 意思是“不要改变任何东西”。
【解决方案2】:

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

RewriteEngine Off

在您要排除被重写的文件夹中(根据树中较高的 .htaccess 文件中的规则)。简单但有效。

【讨论】:

  • +1 ~ .htaccess 分层操作,因此本地文件夹会覆盖其父文件夹,就像 CSS 或 MVC 中的普通级联一样。
  • 您只需要记住一件事:激活 .htaccess 文件(在 apache 配置中将 AllowOverride 设置为 None 以外的任何内容)会强制 apache 在每个请求上搜索 .htaccess。因此,如果您有一个频繁访问的网站/网络服务器,那么文件系统/硬盘访问可能会对性能产生巨大影响......
  • 通过文件方法验证 SSL 证书续订的完美建议。无需修改临时目录之外或 vhost 文件中的任何内容。验证完成后,您只需删除整个文件夹即可。太好了。
【解决方案3】:

添加一个条件来检查管理目录,例如:

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]

【讨论】:

  • 你好 Rob,我把这行放在“RewriteBase /”之后,现在我收到“500 Error - Internal Server Error”
  • @Kelvin 我编辑了我的答案,在您希望它适用的每个规则之前添加条件。
  • 这个是唯一真正帮助我的。 accepted answer 没有没有帮助我。
  • 问号在!^/?(admin|user)/ 中,如果您确定文件夹位于根目录中,则不需要,是吗?
【解决方案4】:

如果你想从规则中删除一个特定的目录(意思是你想删除目录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。注意空格。

    【讨论】:

      【解决方案6】:
      RewriteEngine On
      
      RewriteRule ^(wordpress)($|/) - [L]
      

      【讨论】:

        猜你喜欢
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        相关资源
        最近更新 更多