htaccess 301从目录redirect到文件

我inheritance了一个网站(一个vbulletin论坛),并从另一个主机迁移到我的,通过复制一切与scp命令。 根目录具有以下.htaccess

 RewriteOptions inherit RewriteEngine on RewriteCond %{HTTP_HOST} ^.*$ RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content\/" [R=301,L] 

我不知道这应该如何工作,但它的工作,无论/forums/content/文件夹不存在的事实。 但是,一旦搬到我的主机,它停止工作,产生404错误。 由于/forums/content.php文件存在,我编辑了.htaccess像这样:

 RewriteOptions inherit RewriteEngine on RewriteCond %{HTTP_HOST} ^.*$ RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L] 

现在,它的工作,一个小故障:我的浏览器(和其他论坛用户浏览器)caching以前的301redirect,所以我可以达到和使用论坛,只有当我清除浏览器caching(一次),或者如果我inputcontent.php手动(每次)。

我已经尝试了解决方法,通过添加一个RewriteRule.htaccess来从/forums/content/redirect到/forums/content.php

 RewriteOptions inherit RewriteEngine on RewriteCond %{HTTP_HOST} ^.*$ RewriteRule ^/forums/content/$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L] RewriteRule ^/?$ "http\:\/\/example\.com\/forums\/content.php" [R=301,L] 

但是,似乎这个规则被忽略了,因为浏览器仍然在/forums/content/目录上得到一个404错误,并且不会redirect到content.php 。 我究竟做错了什么?

正如在注释中提到的,当在每个目录的.htaccess文件中使用mod_rewrite时,在RewriteRule 模式匹配的URLpath上没有前导斜杠前缀。 目录前缀(总是以斜线结尾 )首先被删除。

但是,您的指令也是错误的顺序,可以整理。 RewriteCond指令适用于下面的单个RewriteRule 。 你已经在这些指令之间插入了RewriteRule ,所以你已经有效地改变了逻辑。 但是,这两个RewriteRule指令可以很容易地组合, RewriteCond指令看起来是多余的。

除非你特别需要RewriteOptions指令,否则我会删除它。 这可能是以前的主机需要的。

尝试以下方法:

 RewriteEngine on RewriteRule ^(forums/content/)?$ http://example.com/forums/content.php [R=301,L] 

模式 ^(forums/content/)?$匹配/forums/content/或简单/ ,这是原来的RewriteRule匹配。

我已经删除了根据HTTP_HOST检查的RewriteCond指令。 我认为它应该有匹配的东西 (即不是没有)。 然而,它只是匹配任何 永远是真实的东西 ,这似乎有点没有意义。

不需要RewriteRule replace中的所有反斜杠转义。 这是一个普通的string,而不是正则expression式。 (这种不必要的转义是cPanel的典型。)

更新:您将需要确保MultiViews未启用。 这可以使用接近.htaccess文件顶部的Options指令禁用:

 Options -MultiViews 

如果您有现有的Options指令,则可以将其组合,例如:

 Options -MultiViews +FollowSymLinks 

由于/forums是一个物理目录,如果MultiViews被启用,那么在mod_rewrite能够触发redirect之前,它可以导致mod_negotiation对content.php (甚至是其他东西,比如content.html如果存在的话)做内部请求。