我如何忽略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。