无论服务器名称如何,nginx似乎都使用“重写”

无论服务器名称如何,nginx似乎都使用“重写”,nginx,rewrite,Nginx,Rewrite,我有以下配置文件 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; }

我有以下配置文件

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”时,上面的重写规则起作用。(啊)

服务器名称明确表示“web.example.com”

2014/11/18 22:49:20[通知]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重写重定向:“”,客户端:1.2.3.4,服务器:web.example.com,请求:“HEAD/HTTP/1.1”,主机:“example.com”

此处不存在其他服务器{}配置。Xavier(下面)指出,我已经为listen设置了默认的_服务器:443;但不是听:80。(啊)

过了一会儿

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

  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
之前有分号),您不需要重写,因为您有特定的正则表达式。改用这个:


返回301http://www.example.net$request_uri

阅读:这不是原始帖子的严格解决方案。发生的情况是,您只有一个服务器块,它成为所有请求的默认服务器块,即使是与服务器名称不匹配的请求。您只需在配置中添加
服务器{listen 80 default_server;}
。顺便说一句,您有一个输入错误(在
permanent
之前有分号),您不需要重写(没有正则表达式),只需要返回
返回301http://www.example.net$request_uri,它甚至会更有效。我有多个服务器块,其中一个带有默认的\u服务器。我不想显示我的整个配置文件。:)我试过了,只是有一个回报301;我怀疑,它还需要一个位置/{return…}。我现在不想尝试,让安眠药躺着吧。@Daniel也许你需要展示你的完整配置文件,因为我以前在使用nginx的所有版本和操作系统中从未见过这种行为。我在这里创建了要点:我已经删除了所有的mod_pagespeed(简洁)和ssl信息(偏执狂)我将在一天左右将其删除。@Daniel您没有为端口80明确声明默认服务器,仅为端口443声明默认服务器。因此,正如我在回答中所说的,您帖子中的服务器块被隐式地用作每个主机头的默认服务器,这些主机头与
web.example.com
*.example.com
(这是
example.com
)不匹配,因为它是配置中第一个看到的,并且正在侦听
*:80