如何忽略mod_rewrite中的目录?


74

我试图让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阅读以下stackoverflow.com/a/12575089/516748
KCD

Answers:


131

尝试将其放在其他任何规则之前。

RewriteRule ^vip - [L,NC] 

它将匹配任何URI开头vip

  • -方法无能为力。
  • L指这应该是最后一条规则; 忽略以下所有内容。
  • NC装置没有情况下的(因此“VIP”也匹配的)。

请注意,它与任何开头 匹配vip。表达式^vip$将匹配,vip但不匹配vip/vip/index.html。该$会是你的垮台。如果您确实想做正确的事,则可能要选择与之^vip(/|$)不匹配的产品vip-page.html


顺便说一句,几周前我遇到了同样的问题,这在Apache / 2.2.8(UNIX)上对我有用。
Patrick McElhaney

为什么不使用它RewriteRule ^vip/? - [L,NC]来解决斜线问题?
布鲁克。

2
@Brandon基本上等同于^vip。它将匹配“ vip”,后跟一个斜杠(也许)和一些其他字符(也许)。我们要完全匹配“ vip”(^vip$)或任何以“ vip /”开头的字符串(^vip/)。
Patrick McElhaney

不起作用的原因与现有不起作用的原因相同 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d。有问题的目录有一个特殊的.htaccess会导致错误-密码保护的目录也会发生这种情况。
brentonstrine

这工作了。不过我还是对其进行了调整。为了使任何“ / vip /”文件夹都能正常工作,请使用“ RewriteRule \ / vip \ /-[L,NC]”
Kyle Bridenstine 2015年

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

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


他是对的,这些规则应该足够了。问题在于该目录受密码保护。请参阅下面的其他答案(包括我的答案),对此进行详细说明。
brentonstrine

10

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

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

这些行说:“如果它不是现有的文件(-f)或目录(-d),则将其传递给WordPress。添加其他规则,无论它们的具体程度如何,都是多余的-您应该已经被WordPress规则所涵盖!

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

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

解决方法如下:

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

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


1
关于我对此解决方案的支持。我有一个.htaccess密码来保护正在传递给err.txt文件index.php的子目录,从而使我可以访问该目录。
Fotis Paraskevopoulos

1
我在wordpress目录下有另一个文件夹,其中包含一个单独的php应用程序。该应用程序抛出了一个错误,但没有得到错误,而是通过wordpress返回并给了我404。此解决方案解决了该问题,我能够看到php应用程序抛出的500错误。非常感谢!
Paul Zepernick

对于那些受htpasswd保护的子文件夹有问题的用户,这是一个完美的解决方案。谢谢!
尤金·苏

9

总之,最终的解决方案是:

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,我希望我的网站上还会有许多其他内容。


8

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

RewriteEngine off

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


这将无济于事,因为在父目录中确实具有重写规则的.htaccess会在Apache查看/ vip之前很久就得到评估。
Marc B

2
我只是使用了这种方法,所以效果很好。我在父目录中有.htaccess来打开rewriteengine。因此,我猜想Apache会在子目录中查找。
亚当·库尔普

7

尝试替换部分代码:

RewriteRule ^ vip /.$-[PT]

...具有以下内容:

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

那应该解决问题。


如果已经有一条通用规则(阻止所有以。开头的隐藏目录),那么这对我有帮助,但是我需要做一个例外(允许.well为letencrypt在cron上工作是众所周知的)。
squarecandy


3

我在使用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,


3

这有效...

RewriteRule ^vip - [L,NC]

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

在RewriteEngine上

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

3

就我而言,是brentonstrine的答案(我看到了matdumsa也有相同的想法)是正确的……我想对他们的答案进行投票,但是在这里是新手,我没有“声誉”,所以我有写一个完整的答案,以强调我认为这才是真正的关键。

这些答案中的几个会成功阻止WordPress index.php的使用...但是,在许多情况下,这样做的原因是存在一个包含真实页面的真实目录,您希望直接显示该目录,并且

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

生产线已经解决了这一问题,因此大多数解决方案在像我这样的情况下都是分心的。

关键在于brentonstrine的见解,即错误是次要的影响,这是由我试图直接显示的目录内的密码保护引起的。通过放入

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

行和创建错误页面(我实际上创建了err401.html和err403.html并提供了更多信息错误消息),当它找不到要显示的401 Authentication所需的任何页面时,我停止了404响应的生成,然后该文件夹工作了如预期的那样...显示一个apache登录对话框,然后是文件夹的内容,否则将显示错误401页面。


您可以发表评论而不是给出答案。
brentonstrine 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.