我继承了一个站点(一个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]
content.php
现在它可以工作了,但有一个小故障:我的浏览器(以及所有其他论坛用户浏览器)正在缓存以前的 301 重定向,因此只有在我清除浏览器缓存(一次)或输入URL时,我才能访问和使用论坛手动(每次)。
我已经尝试了通过添加to来添加重定向 from /forums/content/
to的解决方法:/forums/content.php
RewriteRule
.htaccess
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 错误并且它不会重定向到content.php
. 我究竟做错了什么?
正如评论中提到的那样,当 mod_rewrite 在每个目录文件中使用时,与pattern
.htaccess
匹配的 URL-path 上没有前导斜杠前缀。首先删除目录前缀(始终以斜杠结尾)。RewriteRule
但是,您的指令也有错误的顺序,可以整理。该
RewriteCond
指令适用于RewriteRule
随后的单曲。你已经RewriteRule
在这些指令之间插入了,所以你已经有效地改变了逻辑。但是这两个RewriteRule
指令可以很容易地结合起来,而且那个RewriteCond
指令看起来是多余的。除非您特别需要该
RewriteOptions
指令,否则我会删除它。这可能在以前的主机上是必需的。请尝试以下操作:
模式
^(forums/content/)?$
匹配/forums/content/
或者简单地匹配,/
这是原始RewriteRule
匹配的。我已经删除了
RewriteCond
检查的指令HTTP_HOST
。我认为它应该匹配某些东西(即不是什么都没有)。然而,它只是匹配了任何永远正确的东西,这似乎有点毫无意义。不需要在
RewriteRule
替换中所有反斜杠转义。这是一个普通的字符串,而不是正则表达式。(这种不必要的转义是 cPanel 的典型特征。)更新:您需要确保未启用 MultiViews。这可以通过文件
Options
顶部附近的指令禁用.htaccess
:如果您有现有
Options
指令,则可以将其组合起来,例如:由于
/forums
是一个物理目录,如果启用了 MultiViews,那么它可能会导致 mod_negotiation在 mod_rewrite 能够触发重定向之前发出内部请求content.php
(甚至是其他东西,比如它是否存在)。content.html