Nginx no-www to www и www to no-www

Я использую nginx на облаке Rackspace после учебника и после поиска в сети и до сих пор не может получить эту сортировку.

Я хочу www.mysite.com перейти к mysite.com как обычно .htaccess для SEO и по другим причинам.

мой / etc/nginx/sites-available / www.пример.com.vhost конфигурация:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

Я также пробовал

server {
       listen 80;
       server_name example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

Я тоже пробовал. Обе вторые попытки дают цикл перенаправления ошибки.

if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}

мой DNS настроен как стандарт:

site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds

(пример IPs и папки использовались для примеров и для помощи людям в будущем). Я использую Ubuntu 11.

15 ответов


решение HTTP

С документация, "правильный способ-определить отдельный сервер для example.org":

server {
    listen       80;
    server_name  example.com;
    return       301 http://www.example.com$request_uri;
}

server {
    listen       80;
    server_name  www.example.com;
    ...
}

HTTPS решение

для тех, кто хочет решение, в том числе https://...

server {
        listen 80;
        server_name www.domain.com;
        # $scheme will get the http protocol
        # and 301 is best practice for tablet, phone, desktop and seo
        return 301 $scheme://domain.com$request_uri;
}

server {
        listen 80;
        server_name domain.com;
        # here goes the rest of your config file
        # example 
        location / {

            rewrite ^/cp/login?$ /cp/login.php last;
            # etc etc...

        }
}

Примечание: я изначально не входило https:// в моем решении, так как мы используем loadbalancers и наш https:// сервер является сервером платежей SSL с высоким трафиком: мы не смешиваем https: / / и http.//:


чтобы проверить версию nginx, используйте nginx -v.

Strip www из url с nginx redirect

server {
    server_name  www.domain.com;
    rewrite ^(.*) http://domain.com permanent;
}

server {
    server_name  domain.com;
    #The rest of your configuration goes here#
}

таким образом, вам нужно иметь два кода сервера.

добавьте www в url-адрес с перенаправлением nginx

Если вам нужно противоположное, перенаправить из domain.com к www.domain.com, вы можете использовать это:

server {
    server_name  domain.com;
    rewrite ^(.*) http://www.domain.com permanent;
}

server {
    server_name  www.domain.com;
    #The rest of your configuration goes here#
}

как вы можете себе представить, это как раз наоборот и так же работает первый пример. Таким образом, вы не получите SEO метки вниз, как это полная Пермь перенаправления и перемещения. Нет WWW принудительно и каталог показан!

некоторые из моего кода, показанного ниже для лучшего просмотра:

server {
    server_name  www.google.com;
    rewrite ^(.*) http://google.com permanent;
}
server {
       listen 80;
       server_name google.com;
       index index.php index.html;
       ####
       # now pull the site from one directory #
       root /var/www/www.google.com/web;
       # done #
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
}

На самом деле вам даже не нужно переписывать.

server {
    #listen 80 is default
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    #listen 80 is default
    server_name example.com;
    ## here goes the rest of your conf...
}

поскольку мой ответ получает все больше и больше голосов, но и выше. Вы никогда не должны использовать rewrite в этом контексте. Почему? Потому что nginx должен обработать и начать поиск. Если вы используете return (который должен быть доступен в любой версии nginx), который непосредственно останавливает выполнение. Это предпочтительно в любом контексте.

перенаправить оба, не SSL и SSL на их не-www аналог:

server {
    listen               80;
    listen               443 ssl;
    server_name          www.example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    return 301 $scheme://example.com$request_uri;
}

server {
    listen               80;
    listen               443 ssl;
    server_name          example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    # rest goes here...
}

в $scheme переменная будет содержать только http если ваш сервер прослушивает только порт 80 (по умолчанию) и опция прослушивания не содержит ssl ключевое слово. Не используя переменную, вы не получите никакой производительности.

обратите внимание, что вам нужно еще больше серверных блоков, Если вы используете HSTS, потому что заголовки HSTS не должны отправляться по незашифрованным соединениям. Следовательно, вам нужны незашифрованные серверные блоки с перенаправлениями и зашифрованные серверные блоки с перенаправлениями и HSTS заголовки.

перенаправить все на SSL (personal config на UNIX с IPv4, IPv6, SPDY, ...):

#
# Redirect all www to non-www
#
server {
    server_name          www.example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:80;
    listen               *:443 ssl spdy;
    listen               [::]:80 ipv6only=on;
    listen               [::]:443 ssl spdy ipv6only=on;

    return 301 https://example.com$request_uri;
}

#
# Redirect all non-encrypted to encrypted
#
server {
    server_name          example.com;
    listen               *:80;
    listen               [::]:80;

    return 301 https://example.com$request_uri;
}

#
# There we go!
#
server {
    server_name          example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:443 ssl spdy;
    listen               [::]:443 ssl spdy;

    # rest goes here...
}

Я думаю, вы можете представить себе другие соединения с этим рисунком теперь самостоятельно.

больше моих конфигураций? Go здесь и здесь.


вы можете узнать, что хотите использовать ту же конфигурацию для других доменов.

следующий фрагмент удаляет www перед любым доменом:

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

вот как это сделать для нескольких www для имен серверов no-www (я использовал это для поддоменов):

server {
        server_name 
             "~^www\.(sub1.example.com)$"
             "~^www\.(sub2.example.com)$"
             "~^www\.(sub3.example.com)$";
         return 301 $scheme://$request_uri ;
}

вам нужны два серверных блока.

поместите их в файл конфигурации, например /etc/nginx/sites-available/sitename

Допустим, вы решили http://example.com как основной адрес.

ваш файл конфигурации должен выглядеть следующим образом:

server {
        listen 80;
        listen [::]:80;
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}
server {
        listen 80;
        listen [::]:80;
        server_name example.com;

        # this is the main server block
        # insert ALL other config or settings in this server block
}

первый серверный блок будет содержать инструкции по перенаправлению любых запросов с префиксом "www". Он слушает запросы на URL с префиксом " www " и перенаправляет.

он ничего не делает еще.

второй блок сервера будет содержать ваш основной адрес-URL, который вы хотите использовать. Все остальные настройки идут здесь, как root, index, location, etc. Проверьте файл по умолчанию для других параметров, которые можно включить в блок сервера.

серверу нужны две записи DNS A.

Name: @ IPAddress: your-ip-address (for the example.com URL)

Name: www IPAddress: your-ip-address (for the www.example.com URL)

для ipv6 создайте пару записей AAAA, используя ваш-ipv6-адрес.


это решение исходит из моего личного опыта. Мы использовали несколько ведер Amazon S3 и один сервер для перенаправления non-www to www доменные имена, чтобы соответствовать S3 "Host" политика заголовка.

я использовал следующую конфигурацию для nginx и сервер:

server {
    listen 80;
    server_name ~^(?!www\.)(?<domain>.+)$;
    return 301 $scheme://www.$domain$request_uri;
}

это соответствует всем доменным именам, указанным на сервере, начиная с чего угодно, но www. и перенаправляет к www.<domain>. Таким же образом вы можете сделать обратное перенаправление www to non-www.


попробуй такое

    if ($host !~* ^www\.){
        rewrite ^(.*)$ https://www.yoursite.com;
    }

другим способом: Nginx нет-www к www

server {
  listen       80;
  server_name  yoursite.com;
  root /path/;
  index index.php;
  return       301 https://www.yoursite.com$request_uri;
}

и www к no-www

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}

уникальный формат:

server {
  listen 80;
  server_name "~^www\.(.*)$" ;
  return 301 https://$request_uri ;
}

редирект без www на www

Для Одного Домена :

server {
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;
}

Для Всех Доменов :

server {
        server_name "~^(?!www\.).*" ;
        return 301 $scheme://www.$host$request_uri;
}

перенаправить www на не-www Для Одного Домена:

server {
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}

Для Всех Доменов :

server {
         server_name "~^www\.(.*)$" ;
         return 301 $scheme://$request_uri ;
}

Я объединил лучшее из всех простых ответов, без жестко заданных доменов.

301 постоянное перенаправление с не-www на www (HTTP или HTTPS):

server {
    if ($host !~ ^www\.) {
        rewrite ^ $scheme://www.$host$request_uri permanent;
    }

    # Regular location configs...
}

если вы предпочитаете не-HTTPS, не-www HTTPS, www перенаправление в то же время:

server {
    listen 80;

    if ($host !~ ^www\.) {
        rewrite ^ https://www.$host$request_uri permanent;
    }

    rewrite ^ https://$host$request_uri permanent;
}

location / { 
    if ($http_host !~ "^www.domain.com"){ 
        rewrite ^(.*)$ $scheme://www.domain.com/ redirect; 
    } 
}

не уверен, что кто-нибудь заметит, что может быть правильно вернуть 301, но браузеры задыхаются от этого

rewrite ^(.*)$ https://yoursite.com; 

быстрее:

return 301 $scheme://yoursite.com$request_uri;

блог призрак

для того, чтобы сделать nginx рекомендуемый метод с return 301 $scheme://example.com$request_uri; работа с призраком вам нужно будет добавить в свой основной серверный блок:

proxy_set_header    X-Real-IP           $remote_addr;
proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
proxy_set_header    Host                $http_host;
proxy_set_header    X-Forwarded-Proto   $scheme;
proxy_set_header    X-NginX-Proxy       true;

proxy_pass_header   X-CSRF-TOKEN;
proxy_buffering     off;
proxy_redirect      off;  

if ($host ~* ^www.example.com$) {
    return 301 $scheme://example.com$request_uri;
}

Если у вас возникли проблемы с получением этой работы, вам может понадобиться, чтобы добавить IP-адрес вашего сервера. Например:

server {
listen XXX.XXX.XXX.XXX:80;
listen XXX.XXX.XXX.XXX:443 ssl;
ssl_certificate /var/www/example.com/web/ssl/example.com.crt;
ssl_certificate_key /var/www/example.com/web/ssl/example.com.key;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}

где XXX.XXX.XXX.XXX-это IP-адрес (очевидно).

Примечание: ssl crt и местоположение ключа должны быть определены для правильного перенаправления https-запросов

Не забудьте перезапустить nginx после внесения изменений:

service nginx restart