Подтвердить что ты не робот

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

Во-первых, как я могу заставить серверный блок ответить на both http://www.mydomain.io, а также http://mydomain.io. Во-вторых, я хочу заставить, если они пришли из http://www.mydomain.io, чтобы перенаправить на http://mydomain.io.

Спасибо.

4b9b3361

Ответ 1

По первому вопросу - просто добавьте оба домена:

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

Ответ 3

Я считаю, что лучше добавить два отдельных серверных блока, чтобы избежать ненужной проверки блоком if. Я также использую переменную $schem, так что запросы 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
}

Ответ 4

Другой способ его кодирования:

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

Он работает даже с несколькими доменными именами одного и того же кода.

Ответ 5

Для общего подхода, не говоря уже о каком-либо конкретном домене или протоколе, я использовал это довольно успешно:

  # 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

Ответ 6

server {
    listen 80;
    server_name www.mydomain.io;
    return 301 https://$host$request_uri;
}

server {
    listen 80;
    server_name mydomain.io;
    ...
}