web-dev-qa-db-ja.com

NginxはWWWを削除し、両方に応答します

次の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;
   }
}

まず、サーバーブロックをbothhttp://www.mydomain.io および http://mydomain.io に応答させるにはどうすればよいですか。次に、それらが http://www.mydomain.io から来た場合、 http://mydomain.io にリダイレクトするように強制したいと思います。

ありがとう。

29
Justin

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;
  # [...]
}
159
Ryan

ifブロックによる不要なチェックを避けるために、2つの別々のサーバーブロックを追加する方が良いと思います。また、HTTPSリクエストが安全でない対応するリクエストにリダイレクトされないように、$ scheme変数を使用します。

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
}
12
Gerry

それをコーディングする別の方法:

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

同じコード上の複数のドメイン名でも機能します。

2
lio

一般的なアプローチでは、特定のドメインやプロトコルについて言及する必要はありませんが、これを非常にうまく使用しました。

  # 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=45 to https://api.example.com/person/123?q = 45

1
GeezerGeek