Як перенаправити 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;
            }
    }

Офіційна документація знаходиться за адресою: nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

Відповіді:


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
ditto @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". Якщо ви сюди просто хочете переадресувати одне місце:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.