我正在使用大量的重定向 301,但它们在新的网络服务器上突然失败了。
在迁移网站之前,我们正在对新的网络服务器进行预生产测试,但有些网站出现故障500内部服务器错误。内容(包括数据库和文件)都从旧服务器镜像到新服务器,因此我们可以测试所有站点是否正常运行。
我把这个问题追溯到mod_alias 的重定向语句,该语句从 .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。旧服务器是 Gentoo 机箱,装有 Apache 2.2.11,而新服务器是 RHEL 5 机箱,装有 Apache 2.2.3。
解决方法是将所有路径更改为完整的 URL,或者将语句转换为 mod_rewrite 规则,但我更喜欢记录的行为。
你有什么经历?
答案1
看来这种行为在不同的 Apache 版本和发行版之间有所不同,并且与 Apache 文档相矛盾(如问题中所述)。非常烦人。我找不到哪个版本支持哪种行为的明显模式。
将所有重定向重写为类似的 RewriteRules 可以达到同样的效果,因为 RewriteRules 更加灵活,但是却牺牲了可读性。
答案2
如果Redirect 301 URL-path URL-path
失败,您可以尝试。它对我而言是有效的,在没有完整 URL 作为目标的RedirectMatch 301 URL-path URL-path
服务器上会抛出 500 内部服务器错误:重定向到非 URL。Redirect
答案3
您必须使用带有新 Web 服务器全名的重定向。因为新 Web 服务器位于新服务器上,所以旧服务器上的 apache 无法仅通过 url 路径来判断要去哪里。当两者不同时,您必须判断它托管在哪台机器上。
您应该考虑另一点:您的旧 wevserver 将来某个时候会关闭吗?您的新服务器会接管旧服务器的 DNS 名称吗?
也许您应该考虑将所有网站迁移到新服务器后再更改 DNS。