htaccess 301 从目录重定向到文件

htaccess 301 从目录重定向到文件

我继承了一个网站(公告栏我创建了一个论坛,然后将其从另一个主机迁移到我的主机上,方法是使用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]

现在它可以工作了,但有一个小问题:我的浏览器(以及每个其他论坛用户的浏览器)正在缓存之前的 301 重定向,所以只有我清除浏览器缓存(一次)或者手动输入 URL content.php(每次)才能访问和使用论坛。

我尝试了一种解决方法,通过添加到来添加从/forums/content/到的重定向:/forums/content.phpRewriteRule.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。我做错了什么?

答案1

正如我在评论中提到的,当在每个目录文件中使用 mod_rewrite 时.htaccess,与 URL 路径匹配的 URL 路径上没有前导斜杠前缀RewriteRule 图案. 目录前缀(总是以斜线结尾) 先被移除。

但是,您的指令顺序也不正确,可以整理一下。该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匹配的内容。

我删除了RewriteCond检查的指令HTTP_HOST。我认为它应该匹配某物(即不为空)。然而,它只是匹配任何事物这将总是是真的,这似乎有点毫无意义。

不需要在RewriteRule 代换。这是一个普通字符串,而不是正则表达式。(这种不必要的转义是 cPanel 的典型特征。)

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

Options -MultiViews

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

Options -MultiViews +FollowSymLinks

由于/forums是一个物理目录,如果启用了 MultiViews,那么它会导致 mod_negotiation 在mod_rewrite 能够触发重定向之前发出内部请求content.php(或者甚至是其他请求,比如它是否存在)。content.html

相关内容