我正在使用大量重定向 301,它们在新的网络服务器上突然失败。
在迁移站点之前,我们正在新的网络服务器上进行预生产测试,但有些站点因500 Internal Server Error而失败。数据库和文件的内容都从旧服务器镜像到新服务器,因此我们可以测试所有站点是否正常工作。
我将此问题追溯到mod_alias 的 Redirect语句,该语句在 .htaccess 中用于将访问者和搜索引擎从旧内容重定向到新页面。
显然 Apache 服务器要求目标是一个完整的 url,包括协议和主机名。
Redirect 301 /directory/ /target/ # Not Valid
Redirect 301 /main.html / # Not Valid
Redirect 301 /directory/ http://www.example.com/target/ # Valid
Redirect 301 /main.html http://www.example.com/ # Valid
这与 Apache 2.2的Apache 文档相矛盾,该文档指出:
新的 URL 应该是一个以方案和主机名开头的绝对 URL,但也可以使用以斜杠开头的 URL 路径,在这种情况下,将添加当前服务器的方案和主机名。
当然,我确认我们在旧服务器和新服务器上都使用了 Apache 2.2。旧服务器是带有 Apache 2.2.11 的 Gentoo 机器,而新服务器是带有 Apache 2.2.3 的 RHEL 5 机器。
解决方法是将所有路径更改为完整 URL,或将语句转换为 mod_rewrite 规则,但我更喜欢记录在案的行为。
你有什么经验?
这种行为似乎在 Apache 版本和发行版之间有所不同,并且与 Apache 文档相矛盾(如问题中所述)。很烦人。我找不到哪个版本支持哪种行为的明显模式。
将所有重定向重写为类似的 RewriteRules 可以解决问题,因为 RewriteRules 更加通用,但以牺牲可读性为代价。
Redirect 301 URL-path URL-path
失败时,您可以尝试RedirectMatch 301 URL-path URL-path
. 它在Redirect
没有完整 URL 作为目标的服务器上为我工作,抛出 500 Internal Server 错误:重定向到非 URL。您必须使用带有新网络服务器全名的重定向。因为新的网络服务器在新服务器上,所以旧服务器上的 apache 无法判断只能通过 url 路径运行。当它不相同时,您必须告诉它托管在哪台机器上。
您应该考虑另一点:您的旧 webserver 会在未来某个时间关闭吗?您的新服务器会接管旧服务器的 dns 名称吗?
也许您应该考虑在将所有网站迁移到新服务器后更改 dns。