如何忽略mod_rewrite中的目录?

时间:2020-03-06 15:02:10  来源:igfitidea点击:

我试图让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等(尽管我不认为这很重要

解决方案

我不确定我是否理解目标,但是以下内容可能会?

RewriteRule ^/vip/(.*)$   /?%{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,我希望我的网站上还会有许多其他内容。