将 301 从目录重定向到单个文件

Posted

技术标签:

【中文标题】将 301 从目录重定向到单个文件【英文标题】:Redirect 301 from a Directory to a Single File 【发布时间】:2011-12-08 12:08:36 【问题描述】:

我在找出应该简单的东西时遇到了一些麻烦。我想 301 将目录中的所有内容重定向到新位置的单个文件。

在我的.htaccess 中,我已经尝试了以下...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/index.html

还有这个……

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/

还有这个……

Redirect 301 /myDir http://www.mydomain.com/myNewDir

问题是每个都只是简单地映射/myDir/ 中的每个文件,并将其附加到目标 URL 的末尾。

谷歌搜索后,我看到了一些说要这样做的东西......

Redirect 301 ^/myDir(.*) http://www.mydomain.com/myNewDir

但这只是做同样的事情......它将现有文件位置映射到 URL 的末尾。

很容易在网上找到很多 ".htaccess redirect" 教程,但它们似乎只显示了诸如“一对一文件映射”或“一对一目录”之类的明显示例映射”。这些教程似乎也忽略了解释各种相关的文件指令以及如何正确使用它们。

这个特定的托管帐户是垃圾,还安装了 FrontPage 扩展。 Mod-rewrite 失败(破坏了整个站点)但 Redirect 301 行运行良好。因此,在我可以将这个新的(非 FrontPage)网站转移到更强大的托管帐户之前,我需要坚持使用 Redirect 301 单行。


如何简单地使用Redirect 301/myDir/ 中的所有内容 重定向到位于/myNewDir/index.html同一个文件? (如果可能的话,我宁愿只使用/myNewDir/)。 请详细解释您的解决方案中使用的文件指令。


更新:

以前接受的答案无效。

例子:

RedirectMatch 301 /myDir1/(.*) http://mydomain.org/newpath/myDir1/index.html

...正在给出 “尝试打开时发生了太多重定向” 错误。

这是因为 /myDir1/(.*) 匹配字符串中的 anyplace,因此如果目标 URL 包含 /myDir1/ 的任何位置,而不仅仅是根,它将被重定向到一个讨厌的循环中。

查看我自己发布的答案以获得正确的解决方案。

【问题讨论】:

【参考方案1】:

我在我的一个旧项目中找到了答案。

Redirect 301 完全错了。我真的想要RedirectMatch 301

RedirectMatch 301 ^/myDir/(.*) http://www.example.com/myNewDir/

说明:

http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch

"该指令等同于Redirect,但使用标准 正则表达式,而不是简单的前缀匹配。”

http://www.zytrax.com/tech/web/regex.htm

“方括号外的^(回旋符或插入符号)表示仅查看 目标字符串的开头,例如^Win 将找不到 Windows 在 STRING1 中,但 ^Moz 会找到 Mozilla。"

还有……

.(句点)表示此位置的任何字符,例如, ton. 会找到 tonstonetonneau 但不会找到 wanton,因为它没有 跟随字符。”

还有……

*(星号或星号)匹配前面的字符 0 个或多个 次,例如,tre* 将找到 tree(2 次)和 tread(1 次) 和trough(0 次)。

【讨论】:

很好,谢谢。这开始让我发疯了。这适用于将整个目录(其中的每个页面)的内容定向到给定页面。 另外值得一提的是,如果您之前有一个 301 重定向到错误的位置(将页面附加到目标 URL),您可能需要清除浏览器缓存,然后它才会选择新规则来自 .htaccess。 Russ 评论的补充:注意使用301(“永久移动”)时可能出现的问题。最好使用302303307 或什么都不用(因为可选),至少用于测试目的。【参考方案2】:

试试这个:

RedirectMatch 301 /myDir/.* http://www.mydomain.com/myNewDir/index.html

参考:http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch。

就 .* 周围的括号而言,RedirectMatch 使用标准正则表达式,这意味着您可以捕获匹配的字符并在重定向规则中使用它们,将它们引用为 $1、$2 等。

在正则表达式中 * 表示前一个字符的任意数量的重复。 . - 表示任何字符。所以组合 .* 表示此模式匹配任意数量的任意字符。因此 * 。 * 表示此模式将匹配 /myDir 和 /myDir/,仍然是 /myDir/test.html。所以 * 。 * 也可以使用

【讨论】:

是的,这行得通。我知道.* 匹配所有文件。但是你能扩展一下吗?有什么变化吗?为什么(.*) 也有效?关于此的在线文档的链接?谢谢! 请参阅:httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch 关于 .* 周围的括号。RedirectMatch 使用标准正则表达式,这意味着您可以捕获匹配的字符并在重定向规则中使用它们,将它们引用为 $1、$2 等。跨度> 在正则表达式中 * 表示前一个字符的任意数量的重复。 . - 表示任何字符。所以组合 .* 表示此模式匹配任意数量的任意字符。因此 * 。 * 表示此模式将匹配 /myDir 和 /myDir/,仍然是 /myDir/test.html。所以 * 。 * 也可以使用。

以上是关于将 301 从目录重定向到单个文件的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 301 将旧域上的所有页面重定向到新域上的单个页面

为 301 重定向配置 Amazon 重定向规则

301 重定向没有子目录/查询字符串

301 重定向最佳实践 - 多个站点到单个站点

htaccess 301 重定向整个目录

从 old.com 到 new.com 的 301 重定向