【问题标题】:How do I ignore a directory in mod_rewrite?如何忽略 mod_rewrite 中的目录?
【发布时间】:2010-09-14 20:47:28
【问题描述】:

我正在尝试让 modrewrite 规则跳过目录 vip。如下所示,我尝试了很多方法,但都无济于事。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#RewriteRule ^vip$ - [PT]
RewriteRule ^vip/.$ - [PT]
#RewriteCond %{REQUEST_URI} !/vip 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

如何让 modrewrite 完全忽略 /vip/ 目录,以便所有请求直接传递到该文件夹​​?

更新:

为了清楚起见:

  • 它托管在 Dreamhost 上
  • 文件夹位于 wordpress 目录中
  • /vip/ 文件夹包含 webdav .htaccess 等(虽然我认为这并不重要

【问题讨论】:

标签: apache mod-rewrite


【解决方案1】:

试着把它放在任何其他规则之前。

RewriteRule ^vip - [L,NC] 

它将匹配任何以 vip 开头的 URI。

  • - 表示什么都不做。
  • L 表示这应该是最后一条规则;忽略后面的一切。
  • NC 表示无大小写(因此“VIP”也匹配)。

请注意,它匹配任何开始 vip。表达式 ^vip$ 将匹配 vip 但不匹配 vip/vip/index.html$ 可能是你的失败。如果你真的想把它做对,你可能想和^vip(/|$)一起去,所以你不匹配vip-page.html

【讨论】:

  • 顺便说一句,几周前我遇到了同样的问题,这在 Apache/2.2.8 (UNIX) 上对我有用。
  • 为什么不使用RewriteRule ^vip/? - [L,NC] 来解决斜线问题?
  • @Brandon 这基本上等同于^vip。它将匹配“vip”,后跟斜杠(可能)和其他一些字符(可能)。我们要准确匹配“vip”(^vip$)或任何以“vip/”开头的字符串(^vip/)。
  • 不起作用的原因与现有的RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d 不起作用的原因相同。有问题的目录有一个特殊的 .htaccess 会导致错误——密码保护的目录也会发生同样的情况。
  • 这行得通。我调整了它以供我自己使用。为了使任何“/vip/”文件夹都能正常工作,请使用“RewriteRule \/vip\/ - [L,NC]”
【解决方案2】:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这表示如果它是现有文件或目录,请不要触摸它。您应该能够访问 site.com/vip,并且不会发生重写规则。

【讨论】:

  • 他是对的,这些规则应该足够了。问题是该目录受密码保护。请参阅下面详细说明的其他答案(包括我的)。
【解决方案3】:

您添加的代码以及所有提供重写规则/条件的答案都是无用的!默认的 WordPress 代码已经完成了您需要的所有工作:

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

那些行说“如果它不是现有文件 (-f) 或目录 (-d),请将其传递给 WordPress。添加额外的规则,无论它们多么具体或好,都是多余的——你应该已经被 WordPress 规则覆盖了!

那么他们为什么不工作???

vip 目录中的.htaccess 抛出错误。如果您使用密码保护目录,则会发生完全相同的事情。

解决办法如下:

ErrorDocument 401 /err.txt
ErrorDocument 403 /err.txt

在 WordPress 代码之前插入这些行,然后创建 /err.txt。这样,当它遇到您的 WebDAV(或受密码保护的目录)并失败时,它将转到该文件,并被现有的默认 WordPress 条件 (RewriteCond %{REQUEST_FILENAME} !-f) 捕获。

【讨论】:

  • 关于我对这个解决方案的支持。我有一个 .htaccess 密码来保护通过 index.php 的子目录,err.txt 文件允许我对目录进行处理。
  • 我在 wordpress 目录下有另一个文件夹,其中包含一个单独的 php 应用程序。该应用程序抛出了一个错误,但它没有收到错误,而是通过 wordpress 返回并给我一个 404。这个解决方案解决了这个问题,我能够看到 php 应用程序抛出的 500 错误。非常感谢!
  • 对于那些对 htpasswd 保护的子文件夹有问题的人来说,这是一个完美的解决方案。谢谢!
【解决方案4】:

综上,最终的解决方案是:

ErrorDocument 401 /misc/myerror.html
ErrorDocument 403 /misc/myerror.html

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

我在我的具体情况下发布了有关此问题原因的更多信息,涉及 Dreamhost 上的 Wordpress 和 WebDAV,我希望许多其他人会在 my site 上拥有。

【讨论】:

    【解决方案5】:

    您提到您在要忽略的目录中已经有一个 .htaccess 文件 - 您可以使用

    RewriteEngine off
    

    在那个 .htaccess 中停止使用 mod_rewrite(不确定您是否在该文件夹中使用 mod_rewrite,如果是,那将无济于事,因为您无法将其关闭)。

    【讨论】:

    • 不会有帮助,因为父目录中的 .htaccess 确实有重写规则,在 Apache 查看 /vip 之前很久就会被评估。
    • 我刚用了这个方法,效果很好。我在父目录中有 .htaccess 打开 rewriteengine。所以我猜 Apache 无论如何都会在子目录中查找。
    【解决方案6】:

    尝试替换这部分代码:

    重写规则 ^vip/.$ - [PT]

    ...带有以下内容:

    RewriteCond %{REQUEST_URI} !(vip) [NC]

    这应该可以解决问题。

    【讨论】:

    • 这在已经存在一般规则的情况下帮助了我(阻止所有以 . 开头的隐藏目录),但我需要做一个例外(允许 .well-known forletsencrypt在 cron 上工作)。
    【解决方案7】:
    RewriteCond %{REQUEST_URI} !^pilot/ 
    

    是这样做的方法。

    【讨论】:

      【解决方案8】:

      我在使用 wordpress 时遇到了同样的问题,发现该问题与没有适当的 401 和 403 错误处理程序有关..

      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      

      这些条件本来应该不会重写现有文件夹的 url,但它们不会为受密码保护的文件夹完成工作。在我的情况下,将以下两行添加到我的根 .htaccess 解决了问题:

      ErrorDocument 401 /misc/myerror.html
      ErrorDocument 403 /misc/myerror.html
      

      当然你需要创建/misc/myerror.html,

      【讨论】:

        【解决方案9】:

        这行得通...

        RewriteRule ^vip - [L,NC]
        

        但要确保它是之后的第一条规则

        重写引擎开启

        ErrorDocument 404 /page-not-found.html
        
        RewriteEngine on
        
        RewriteRule ^vip - [L,NC]
        
        AddType application/x-httpd-php .html .htm
        
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d 
        
        etc
        

        【讨论】:

          【解决方案10】:

          就我而言,brentonsrine 的答案(我看到 ma​​tdumsa 也有同样的想法)是正确的……我想给他们投票答案,但在这里是新人,我没有“声誉”,所以我必须写一个完整的答案,以强调我认为这里真正的关键。

          其中一些答案会成功阻止 WordPress index.php 被使用......但在许多情况下,这样做的原因是有一个真实的目录,其中包含您想要直接显示的真实页面,和

          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          

          生产线已经解决了这个问题,所以在我这样的案例中,大多数解决方案都会分散注意力。

          关键是 brentonsrine 的洞察力,即错误是次要影响,由我试图直接显示的目录中的密码保护引起。通过放入

          ErrorDocument 401 /err.txt
          ErrorDocument 403 /err.txt
          

          行并创建错误页面(我实际上创建了 err401.html 和 err403.html 并提供了更多信息性错误消息)当它找不到任何页面以显示需要 401 身份验证时,我停止生成 404 响应,然后文件夹按预期工作...显示 apache 登录对话框,然后显示文件夹的内容,或者失败时显示我的错误 401 页面。

          【讨论】:

          • 你可以留下评论而不是回答。
          【解决方案11】:

          我不确定我是否理解您的目标,但以下内容可能会满足您的需求?

          RewriteRule ^/vip/(.*)$   /$1?%{QUERY_STRING} [L]
          

          这将导致在没有 /vip 的情况下重写诸如 http://www.example.com/vip/fred.html 之类的 URL。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-24
            • 2020-05-05
            • 1970-01-01
            • 1970-01-01
            • 2016-10-15
            • 2010-11-08
            • 1970-01-01
            • 2018-04-04
            相关资源
            最近更新 更多