无论服务器名称如何,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
。