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

更新:

澄清一下:

  • 是在梦主机上主持的
  • 这些文件夹位于 wordpress 目录中
  • /vip/文件夹包含一个 webdav. htaccess 等(尽管我不认为这很重要
99561 次浏览

我不确定我是否理解你的目的,但是下面这些可能会达到你的目的?

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

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

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

RewriteRule ^vip - [L,NC]

它将匹配任何从 vip开始的 URI。

  • -的意思是什么都不做。
  • L意味着这应该是最后一条规则; 忽略以下所有内容。
  • NC表示没有大小写(因此“ VIP”也是匹配的)。

请注意,它匹配任何 开始vip。表达 ^vip$将匹配 vip,但不匹配 vip/vip/index.html$可能是你的弱点。如果你真的想做的正确,你可能想去与 ^vip(/|$)所以你不匹配 vip-page.html

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

RewriteEngine off

穿着那个。Htaccess 来停止使用 mod _ rewrite (不确定你是否在那个文件夹中使用 mod _ rewrite,如果是的话,那也没用,因为你无法关闭它)。

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

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

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

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

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,我希望在 我的网站上也有很多这样的帖子。

这个可以..。

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/

就是这样做。

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

RewriteRule ^vip/.$ - [PT]

...with the following:

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

这样应该能解决问题。

您正在添加的代码,以及提供重写规则/条件的所有答案都是无用的!默认的 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)捕获。

在我的案例中,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,并提供了更多的信息错误消息)我停止了404响应生成时,它找不到任何页面显示401验证需要,然后文件夹工作正常... 显示一个 apache 登录对话框,然后文件夹的内容,或失败,我的错误401页面。