【问题标题】:Apache %{SERVER_NAME} not resolving to ServerNameApache %{SERVER_NAME} 未解析为 ServerName
【发布时间】:2018-08-04 23:49:00
【问题描述】:

我在 Apache 2.4 中有以下 VirtualHost

<VirtualHost example.com:80>
  ServerName www.example.com
  ServerAlias example.com
  DocumentRoot /dev/null
  RewriteEngine on
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301]
</VirtualHost>

我希望它重定向

http://www.example.com/ -> https://www.example.com/
http://example.com/ -> https://www.example.com/

但是,它会重定向

http://www.example.com/ -> https://www.example.com/
http://example.com/ -> https://example.com/

我不明白...它重定向到 %{HTTP_HOST}。 %{SERVER_NAME} 不应该是 ServerName 吗?这是预期的行为,还是我在其他地方有错误?另外,VirtualHost 语句中的主机名有什么相关性?我还没有找到这方面的信息。谢谢。

【问题讨论】:

  • UseCanonicalName On 可能会有所帮助。
  • 谢谢,实际上这很有帮助。但我不确定这是否是真正的解决方案。 UseCanonicalName On 会影响服务器的许多内部处理。在我的情况下,VHost 除了重定向之外什么都不做,但在其他情况下是什么?我仍然对 %{SERVER_NAME} 默认包含 HTTP_HOST 感到震惊。
  • 您有一个 serveralias 匹配,使其作为 server_name 有效,这就是原因。如果你只是想重定向到 https www.example.com 它就像Redirect / https://www.example.com/ 一样简单
  • 忘了说,virtualhost 指令不能与主机名一起使用,只能与 *:port 或 ip:port 一起使用。

标签: apache httpd.conf


【解决方案1】:

好的,正如rewritecond 和 usecanonicalname

UseCanonicalName On

解决了问题(但还有其他含义)。尽管如此,%{SERVER_NAME} 实际上包含 HTTP_HOST。 如果有人知道如何使用 UseCanonicalName Off 查询 ServerName,请告诉我。

【讨论】:

  • 其他含义是什么?
  • 如文档所述,apache 将使用 ServerName 进行大量内部重定向等。我尚未对其进行测试,但在您通常希望允许访问所有别名的服务器上,这可能是一个问题。例如在我的情况下(没有重定向)访问http://example.com/sub/ 将从服务器/sub/index.html 文件中返回文档。但是,访问 http://example.com/sub 会导致重定向到 http://www.example.com/sub/ 。这可能是例如导致会话无效。
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多