【问题标题】:Apache RedirectMatch issue with relative pathApache RedirectMatch 的相对路径问题
【发布时间】:2013-10-17 19:10:53
【问题描述】:

最近,我将我的 Apache 服务器从 2.0 升级到 2.2.24,但我遇到了 RedirectMatch 的问题。

我的旧RedirectMatch 指令:

RedirectMatch ^/abc/abcd  /otherurl/someaction

在 Apache 2.0 中,如果我们使用 HTTPS 访问,例如。 https://www.example.com/abc/abcd,它将重定向到https://www.example.com/otherurl/someaction

但在 apache 2.2.24 中,它返回 http://www.example.com/otherurl/someaction(HTTP,而不是 HTTPS)——看来 Apache 已经更改了请求架构。

如果我通过 http watch 检查 HTTP 响应,我发现 2.0 和 2.2.24 之间存在差异。

在 Apache 2.0 下,Location HTTP 响应标头是 /otherurl/someaction - 一个相对路径 URL。

但在 Apache 2.2.24 上,Location 标头是 http://www.example.com/otherurl/someaction - 完整的绝对 URL。

对这个问题有什么想法吗?

【问题讨论】:

  • 您能否在RedirectMatch 周围添加您的整个配置?如果我理解您的问题是正确的,您在进行重定向时会错过 SSL 部分吗?
  • 可能是您的https 站点未在Apache 2.2 中启用,从而使http 站点成为默认站点?
  • FWIW 在 Apache 2.0 下严格要求绝对目标 URL,因为 Apache 不会“修复”目标 URL(即Location HTTP 响应标头的值)是绝对的(这已更改在 Apache 2.2.6 中)。如果 Apache 没有使目标 URL 成为绝对 URL,则由用户代理来解析 URL。在 RFC 2616(现在被 RFC 7321 取代)中,声明 Location 标头必须是绝对的,因此为什么某些“旧”用户代理可能不接受相对 URL。

标签: apache http-redirect mod-alias


【解决方案1】:

我认为您的问题是 Redirect 从 2.0 更改为 2.2(.6)。并根据文档:

旧的 URL 路径是以斜杠开头的区分大小写(% 解码)的路径。一个亲戚 路径是不允许的。新 URL 应该是一个以 scheme 开头的绝对 URL,并且 主机名。在 Apache HTTP Server 2.2.6 及更高版本中,以斜杠开头的 URL 路径可能 也可以使用,在这种情况下,将添加当前服务器的方案和主机名。

我建议将规则更改为这个如果你错过了https重定向:

RedirectMatch ^/abc/abcd https://www.example.com/otherurl/someaction

希望对您有所帮助。

【讨论】:

  • 感谢您的 cmets,但主机名是动态的,它是基于请求的,在 mod_alias 中,我怎样才能获得请求中的 ${HTTP_Host}??
  • 我们谈论多少主机?如果只是一对,你可以将它们硬编码成不同的VirtualHost,如果你需要它是动态的,你应该考虑使用mod_rewrite并使用RewriteRule而不是RedirectMatch
  • 同意,我认为我必须通过 mod_rewrite 更改此重写规则。再次感谢您的 cmets 和建议。
  • 如文档中所述,“将添加当前服务器的方案和主机名” - 所以这应该在 Apache 2.2.24 上保持不变。该问题可能是由其他一些服务器配置问题引起的(例如,SSL 是由 Apache 还是前端代理处理的?)。
猜你喜欢
  • 2014-05-09
  • 2016-01-08
  • 2011-04-29
  • 1970-01-01
  • 2014-03-01
  • 2015-08-14
  • 2016-02-16
  • 2016-07-10
  • 2019-03-16
相关资源
最近更新 更多