Як заставити nginx перенаправляти з www на домен не www?


9

Скажімо, я хочу перенаправити з www.example.com на example.com, і я хочу це зробити за допомогою nginx. Я озирнувся і не побачив жодної гарної документації з цього приводу, тому зрозумів, що запитаю і відповів на власне питання.

Відповіді:


7

Я також переглянув це на вікі Nginx та інших блогах, і найкращим способом роботи є наступне:

Для переадресації з www.example.com на example.com за допомогою nginx (версія 1.0.12 під час написання).

server {
  server_name www.example.com;
  rewrite ^ $scheme://example.com$request_uri permanent; 
  # permanent sends a 301 redirect whereas redirect sends a 302 temporary redirect
  # $scheme uses http or https accordingly
}

server {
  server_name example.com;
  # the rest of your config goes here
}

Коли запити надходять на example.com, ні, якщо для ефективності використовуються оператори. І він використовує $ request_uri, а не створювати збіг $ 1, який оподатковує перезапис (див. Сторінку загальних підводних каменів Nginx).

Джерела:


У моєму тесті директиви повинні бути зворотні, тобто. перезапис повинен відбуватися після основного server {}блоку конфігурації.
karmi

4

Після декількох копань та помилок, ось рішення. Гатча, на яку я зіткнувся, - це переконатися у використанні " http://example.com $ uri". Вставлення а / перед $ uri призводить до переадресації на http://example.com//

  server {
    listen 80;
    server_name www.example.com;
    rewrite ^ http://example.com$uri permanent;
  }

  # the server directive is nginx's virtual host directive.
  server {
    # port to listen on. Can also be set to an IP:PORT
    listen 80;

    # Set the charset
    charset utf-8;

    # Set the max size for file uploads to 10Mb
    client_max_body_size 10M;

    # sets the domain[s] that this vhost server requests for
    server_name example.com;

    # doc root
    root /var/www/example.com;

    # vhost specific access log
    access_log  /var/log/nginx_access.log  main;


    # set vary to off to avoid duplicate headers
    gzip off;
    gzip_vary off;


    # Set image format types to expire in a very long time
    location ~* ^.+\.(jpg|jpeg|gif|png|ico)$ {
        access_log off;
        expires max;
    }

    # Set css and js to expire in a very long time
    location ~* ^.+\.(css|js)$ {
        access_log off;
        expires max;
    }

    # Catchall for everything else
    location / {
      root /var/www/example.com;
      access_log off;

      index index.html;
      expires 1d;

      if (-f $request_filename) {
        break;
      }
    }
  }

4

Будь ласка, відвідайте це запитання в SO: https://stackoverflow.com/a/11733363/846634

З кращої відповіді:

Насправді вам навіть не потрібно переписувати.

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), це безпосередньо зупиняє виконання. Це бажано в будь-якому контексті.


1

Щоб перенаправити на не-www, змініть файл vhost:

server {
  listen 80;
  server_name www.example.com;
  rewrite ^/(.*) http://example.com/$1 permanent;
}

"Постійний" перетворює переадресацію в переадресацію 301. Після цього блоку коду ви можете налаштувати домен без www.

Для перенаправлення не-www на www:

server {
  listen 80;
  server_name example.com;
  rewrite ^/(.*) http://www.example.com/$1 permanent;
}

Тасіт.

BTW, для повного налаштування VPS за допомогою Nginx, перегляньте Біблію VPS на своєму сайті, guvnr.com, і я сподіваюся, що це зручно!


0

Це те, що я використовую:

# ---------------------------------------
# vHost www.example.com
# ---------------------------------------

server {

##
# Redirect www.domain.tld
##

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

}

# ---------------------------------------
# vHost example.com
# ---------------------------------------

server {

   # Something Something
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.