如何忽略 mod_rewrite 中的目录?

Posted

技术标签:

【中文标题】如何忽略 mod_rewrite 中的目录?【英文标题】:How do I ignore a directory in 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 2.2 上你可能需要 RewriteCond %DOCUMENT_ROOT%REQUEST_FILENAME !-f 阅读这个 ***.com/a/12575089/516748 【参考方案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。

【讨论】:

以上是关于如何忽略 mod_rewrite 中的目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使子目录中的 cakePHP 2.x 出现在根目录中(在 htaccess 中使用 mod_rewrite)? [关闭]

为啥 ?XDEBUG_PROFILE=true 被 mod_rewrite 忽略?

如何使用子域链接子目录? (虚拟主机、mod_rewrite、htaccess、DNS)

使用 .htaccess 时如何使 mod_rewrite *not* 执行主目录扩展

mod_rewrite中的redirectMatch

Azure 中的 Mod_rewrite