Как перенаправить URL в NGINX


135

Мне нужно перенаправить каждый запрос http://test.com на http://www.test.com . Как это может быть сделано.

В блоке сервера я попытался добавить

 rewrite ^/(.*) http://www.test.com/$1 permanent;

но в браузере это говорит

  The page isn't redirecting properly

  Firefox has detected that the server is redirecting the request for 
  this address in a way that will never complete.

мой блок сервера выглядит

 server {
            listen       80;
            server_name  test.com;
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            #rewrite ^/(.*) http://www.test.com/$1 permanent;
            #rewrite ^(.*)$ $scheme://www.test.com$1;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }

Ответы:


274

Лучший способ сделать то, что вы хотите, это добавить еще один блок сервера:

server {
        #implemented by default, change if you need different ip or port
        #listen *:80 | *:8000;
        server_name test.com;
        return 301 $scheme://www.test.com$request_uri;
}

И отредактируйте свою переменную server_name блока главного сервера следующим образом:

server_name  www.test.com;

Важно : Новый serverблок - это правильный способ сделать это, ifэто зло . Вы должны использовать местоположения и серверы, а не, ifесли это возможно. Rewriteиногда тоже зло , поэтому заменил его на return.


19
Вы также можете завершить этот блок сервера return 301 http://wwww.test.com$request_uri;вместо перезаписи.
RCCola

6
То же самое @RCCola при использовании returnвместо rewrite. Смотрите документы
JCotton

Вопрос, как должны быть упорядочены серверные блоки? redirectто main serverблок или main serverблок тогда redirect? Поскольку у меня та же проблема, stackoverflow.com/questions/35451929/…
jhnferraris

Конфигурация Nginx в указанном вопросе верна, порядок не имеет значения.
Дмитрий Верхотуров

4
Просто быстрое предупреждение: остерегайтесь 301перенаправления против 302. Вы можете застрять в кэшированном постоянном перенаправлении, что очень затрудняет изменение настроек для клиентов, которые уже получили доступ к URL-адресу. (Я знаю, что ОП попросил 301, но будьте уверены, что это действительно то, что вы хотите.)
Ник Меррилл

16

Аналогично другому ответу, но измените http в схеме перезаписи на $ следующим образом:

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}

И отредактируйте свою переменную server_name блока главного сервера следующим образом:

server_name  www.test.com;

Я должен был сделать это, чтобы перенаправить www.test.com на test.com.


9

Сначала убедитесь, что вы установили Nginx с модулем перезаписи HTTP. Чтобы установить это нам нужно иметь pcre-библиотеку

Как установить библиотеку pcre

Если вышеупомянутое сделано или если у вас уже есть, просто добавьте приведенный ниже код в свой блок сервера nginx

  if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
  }

Для удаления www из каждого запроса вы можете использовать

  if ($host = 'www.your_domain.com' ) {
   rewrite  ^/(.*)$  http://your_domain.com/$1  permanent;
  }

так ваш блок сервера будет выглядеть

  server {
            listen       80;
            server_name  test.com;
            if ($host !~* ^www\.) {
                    rewrite ^(.*)$ http://www.$host$1 permanent;
            }
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }

3

Это самый популярный сайт в Google по запросу "nginx redirect". Если вы попали сюда, просто хотите перенаправить одно местоположение:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.