我如何忽略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/目录,以便所有请求直接传递到文件夹?

更新:

作为清晰点:

  • 它托pipe在Dreamhost上
  • 这些文件夹在一个wordpress目录中
  • / vip /文件夹包含一个webdav .htaccess等(虽然我不认为这很重要

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

 RewriteRule ^vip - [L,NC] 

它将匹配任何URI开始vip

  • 意味着什么都不做。
  • L表示这应该是最后的规则; 忽略以下的一切。
  • NC意味着没有情况(所以“VIP”也匹配)。

请注意,它匹配任何开始 vip 。 expression式^vip$将匹配vip但不匹配vip/vip/index.html$可能是你的倒台。 如果你确实想要做的话,你可能想要使用^vip(/|$)所以你不匹配vip-page.html

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

这说,如果它是一个现有的文件或目录不要触摸它。 您应该可以访问site.com/vip,不应该发生重写规则。

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

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

这些行说“如果它不是一个现有的文件( -f )或目录( -d ),传递给WordPress。添加额外的规则,不pipe它们是多么具体或好,是多余的 – 你应该已经被覆盖WordPress的规则!

那他们为什么不工作?

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

这是解决scheme:

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

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

你提到你已经在你想忽略的目录中有一个.htaccess文件 – 你可以使用

 RewriteEngine off 

在那个.htaccess停止使用mod_rewrite(不知道如果你在那个文件夹中使用mod_rewrite,如果你是这样,将无法帮助,因为你不能closures它)。

总之,最终的解决scheme是:

 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,我期望很多其他人在我的网站上 。

尝试replace这部分代码:

  RewriteRule ^ vip /.$  -  [PT] 

…与以下内容:

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

这应该解决这个问题。

我有同样的问题,使用wordpress,并发现问题是没有正确的处理程序401和403错误链接..

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

这些条件已经不应该重写现有的文件夹的url,但他们不做他们的密码保护文件夹的工作。 在我的情况下,添加以下两行到我的根.htaccess修复了这个问题:

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

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

这工作…

 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 
 RewriteCond %{REQUEST_URI} !^pilot/ 

是做到这一点的方法。

在我的情况下, brentonstrine (我看到matdumsa也有同样的想法)的答案是正确的…我想上调他们的答案,但在这里新来的,我没有“声誉”,所以我有写一个完整的答案,以强调我认为是真正的关键在这里。

这些答案中的几个将成功地停止使用WordPress的index.php …但在很多情况下,这样做的原因是,有一个真正的目录与真正的网页,你想要直接显示,并

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

线已经照顾到了,所以这些解决scheme大多是像我的情况分心。

关键是brentonstrine的洞察力,错误是一个次要的影响,由我试图直接显示目录内的密码保护引起的。 通过投入

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

行和创build错误页面(我实际上创build了err401.html和err403.html,并提供更多的信息性错误消息)我停止404响应正在生成时,它无法find任何页面显示401 Authentication Required,然后文件夹工作如预期…显示一个Apachelogin对话框,然后该文件夹的内容,或失败,我的错误401页面。

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

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

这会导致诸如http://www.example.com/vip/fred.html之类的URL被重写,而没有/ vip。