Nginx и не-www на www и WWW на без-www



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



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



мой в/etc/nginx/сайты доступны/ВСП.пример.ком.файл 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.

925   15  

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 from url with 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 redirect

Если вам нужно обратное, чтобы перенаправить с 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 не должны передаваться по незашифрованным соединениям. Следовательно, необходимо незашифрованные блоки с сервера редиректы и зашифрованный сервер блокирует с редиректов и ВПЖ заголовки.

перенаправить все на 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...
}

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

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

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

следующий фрагмент удаляет 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 и т. д. Проверьте файл по умолчанию для этих параметров можно включить в блок Server.

серверу нужны две записи 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" header policy.

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

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

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

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

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

другим способом: Nginx no-www to 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 на non-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

Comments

    Ничего не найдено.