【问题标题】:nginx appears to use rewrite regardless of server_name无论 server_name 如何,nginx 似乎都使用 rewrite
【发布时间】:2015-01-17 00:09:42
【问题描述】:

我有以下配置文件。

server {
  listen 80;
  server_name web.example.com;

  access_log  /var/www/example/shared/log/web.access.log;
  error_log  /var/www/example/shared/log/web.error.log debug;

  rewrite ^/(.*)$ http://www.example.net$request_uri; permanent;
}

当我请求 curl -Ii -H "Host: example.com" http://example.com 时,上述重写规则有效。 (ARGH)..

server_name 明确表示“web.example.com”

2014/11/18 22:49:20 [notice] 30694#0: 1868 "^/(.)$" 匹配 "/",客户端:1.2.3.4,服务器:web .example.com,请求:“HEAD / HTTP/1.1”,主机:“example.com” 2014/11/18 22:49:20 [通知] 30694#0: *1868 重写重定向:“http://www.example.net/”,客户端:1.2.3.4,服务器:web.example.com,请求:“HEAD / HTTP/1.1 ", 主机: "example.com"

此处不存在其他服务器 { } 配置。 Xavier(下)指出我已将 default_server 设置为 listen: 443;但不适合听:80。(啊)

【问题讨论】:

标签: nginx rewrite


【解决方案1】:

这不是问题的严格解决方案。

发生的情况是您只有一个服务器块,它成为所有请求的默认服务器块,即使是与服务器名称不匹配的请求。您只需在配置中添加一个默认服务器块:

server {
    listen 80 default_server;
} 

顺便说一句,您有一个错字(permanent 之前的分号)并且您不需要重写,因为您有特定的正则表达式。改用这个:

return 301 http://www.example.net$request_uri;

【讨论】:

  • 我确实有多个服务器块,其中一个带有 default_server。我不想显示我的整个配置文件。 :)
  • 我试过了,只要返回 301 example.net$request_uri;我怀疑,它还需要一个位置 / { return ... }。我现在不想尝试,让睡狗躺着吧。
  • @Daniel 也许你需要展示你的完整配置文件,因为我之前从未在我使用 nginx 的所有版本和操作系统中都看到过这样的行为。
  • 我在这里创建了要点:gist.github.com/danlo/88973cafb2898c0bd017 我已经删除了所有的 mod_pagespeed(简洁)和 ssl 信息(偏执狂)我会在一天左右删除它。
  • @Daniel 您没有为端口 80 明确声明默认服务器,仅针对端口 443。所以正如我在回答中所说,您帖子中的服务器块被隐含地用作默认服务器对于每个不匹配 web.example.com*.example.com 的主机头(example.com 就是这种情况),因为它是第一个出现在配置中并在 *:80 上侦听的。
【解决方案2】:

过了一会儿……

我发现我需要将位置 / { } 包裹起来

  server {
    listen 80;
    server_name web.example.com;

    access_log  /var/www/example/shared/log/web.access.log;
    error_log  /var/www/example/shared/log/web.error.log debug;

    location / {
      rewrite ^/(.*)$ http://www.example.net$request_uri permanent;
    }
  }

【讨论】:

  • 这不是原始帖子的严格解决方案。发生的情况是您只有一个服务器块,它成为所有请求的默认服务器块,即使是那些与服务器名称不匹配的请求。您只需在配置中添加server { listen 80 default_server; }。顺便说一句,你有一个错字(permanent 之前的分号)并且你不需要重写(没有正则表达式)但返回 return 301 http://www.example.net$request_uri;,它甚至会更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2017-10-30
  • 2012-11-12
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多