![htaccess 301 从目录重定向到文件](https://linux22.com/image/696498/htaccess%20301%20%E4%BB%8E%E7%9B%AE%E5%BD%95%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6.png)
我继承了一个网站(公告栏我创建了一个论坛,然后将其从另一个主机迁移到我的主机上,方法是使用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.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
。我做错了什么?
答案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