如何忽略mod_rewrite中的目录?

时间:2008-10-02 16:23:38

标签: apache mod-rewrite

我正在尝试让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等(虽然我不认为这很重要

11 个答案:

答案 0 :(得分:127)

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

RewriteRule ^vip - [L,NC] 

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

  • -意味着什么都不做。
  • L表示这应该是最后一条规则;忽略以下一切。
  • NC表示无案例(因此“VIP”也匹配)。

请注意,它匹配任何开头 vip。表达式^vip$将与vip匹配,但不会与vip/vip/index.html匹配。 $可能是你的垮台。如果你真的想要做得对,你可能想要^vip(/|$),所以你不匹配vip-page.html

答案 1 :(得分:14)

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

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

答案 2 :(得分:10)

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

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

这些行说&#34;如果它不是现有文件(-f)或目录(-d),则将其传递给WordPress。添加额外的规则,无论它们具体或有多好,都是多余的 - 您应该已经被WordPress规则所涵盖了!

那他们为什么不工作?

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

以下是解决方案:

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

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

答案 3 :(得分: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,我希望其他人在my site上有这个问题。

答案 4 :(得分:8)

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

RewriteEngine off

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

答案 5 :(得分:6)

尝试替换代码的这一部分:

RewriteRule ^vip/.$ - [PT]

......以下内容:

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

这应该解决问题。

答案 6 :(得分:4)

RewriteCond %{REQUEST_URI} !^pilot/ 

是这样做的方法。

答案 7 :(得分: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,

答案 8 :(得分: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

答案 9 :(得分:2)

在我的情况下, 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页面。

答案 10 :(得分:-1)

我不确定我是否理解你的目标,但以下可能会做你想要的事情?

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

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