如何忽略 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 的答案(我看到 matdumsa 也有同样的想法)是正确的……我想给他们投票答案,但在这里是新人,我没有“声誉”,所以我必须写一个完整的答案,以强调我认为这里真正的关键。
其中一些答案会成功阻止 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)