32

我有以下 nginx 配置片段:

server {
   listen 80;

   server_name mydomain.io;

   root /srv/www/domains/mydomain.io;

   index index.html index.php;

   access_log /var/log/nginx/domains/mydomain.io/access.log;
   error_log /var/log/nginx/domains/mydomain.io/error.log;

   location ~\.php {
      try_files $uri =404;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_intercept_errors on;
      fastcgi_pass 127.0.0.1:9000;
      include /etc/nginx/fastcgi_params;
   }
}

首先,我怎样才能让服务器块响应both http://www.mydomain.iohttp://mydomain.io。其次,如果他们来自http://www.mydomain.io ,我想强制重定向到http://mydomain.io

谢谢。

4

6 回答 6

186

根据https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if,您应该使用:

server {
  server_name www.example.com;
  return 301 $scheme://example.com$request_uri;
}
server {
  server_name example.com;
  # [...]
}
于 2013-10-08T03:32:43.323 回答
13

我认为最好添加两个单独的服务器块以避免不必要的if块检查。我还使用了 $scheme 变量,这样 HTTPS 请求就不会被重定向到不安全的对应对象。

server {
    listen 80;

    server_name www.mydomain.io;

    rewrite ^ $scheme://mydomain.io$uri permanent;
}

server {
    listen 80;

    server_name mydomain.io;

    # your normal server block definitions here
}
于 2012-12-20T10:11:40.393 回答
7

对于通用方法,无需提及任何特定的域或协议,我已经非常成功地使用了它:

  # rewrite to remove www.
  if ( $host ~ ^www\.(.+)$ ) {
    set $without_www $1;
    rewrite ^ $scheme://$without_www$uri permanent;
  }

这将重定向:https://www.api.example.com/person/123?q=45https://api.example.com/person/123?q=45

于 2017-08-14T14:22:36.560 回答
5

另一种编码方式:

if ($http_host ~* "^www\.(.+)$"){
    rewrite ^(.*)$ http://%1$request_uri redirect;
}

它甚至可以在同一代码上使用多个域名。

于 2014-07-08T18:34:49.457 回答
-2
server {
    listen 80;
    server_name www.mydomain.io;
    return 301 https://$host$request_uri;
}

server {
    listen 80;
    server_name mydomain.io;
    ...
}
于 2016-06-23T08:37:54.283 回答
-21

在第一个问题上 - 只需添加两个域:

server_name mydomain.io www.mydomain.io;

对于第二个,您需要这个简单的重定向:

server {
      listen 80;

      server_name www.mydomain.io mydomain.io;

      if ($host = 'www.mydomain.io' ) {
         rewrite  ^/(.*)$  http://mydomain.io/$1  permanent;
      }
于 2012-07-04T08:08:44.960 回答