Я использую nginx в облаке Rackspace после урока и поищу в сети, и пока не могу отсортировать его.
Я хочу, чтобы www.mysite.com заходил на mysite.com как обычно в .htaccess по SEO и другим причинам.
Мой /etc/nginx/sites-available/www.example.com.vhost config:
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
(примеры IP-адресов и папок были использованы для примеров и для помощи людям в будущем). Я использую Ubuntu 11.
Dashboard > Settings > General Settings
и убедитесь, чтоwww
в URL-адресах WordPress Address / Site Address их нет. Независимо от того, как вы сконфигурируете свой nginx, если у вас есть www в этих URL, он будет перенаправлен на тот, в котором есть www.Ответы:
HTTP решение
Из документации «правильный способ - определить отдельный сервер для example.org»:
HTTPS-решение
Для тех, кто хочет решения, в том числе
https://
...Примечание. Изначально я не включал
https://
в свое решение, поскольку мы используем loadbalancers, а наш https: // сервер является сервером платежей SSL с высоким трафиком: мы не смешиваем https: // и http: //.Чтобы проверить версию nginx, используйте
nginx -v
.Уберите www с URL с помощью nginx redirect
Таким образом, вы должны иметь два кода сервера.
Добавьте WWW к URL с перенаправлением nginx
Если вам нужно обратное, для перенаправления с domain.com на www.domain.com вы можете использовать это:
Как вы можете себе представить, это как раз наоборот и работает так же, как в первом примере. Таким образом, вы не получите SEO-оценки, так как это перманентное перенаправление и перемещение. Нет WWW принудительно и каталог отображается!
Часть моего кода показана ниже для лучшего обзора:
источник
return 301 $scheme://domain.com$request_uri;
. Нет необходимости фиксировать какие-либо закономерности, см. Подводные камни NginxНа самом деле вам даже не нужно переписывать.
Как мой ответ набирает все больше и больше голосов, но и выше. Вы никогда не должны использовать
rewrite
в этом контексте. Почему? Потому что nginx должен обработать и начать поиск. Если вы используетеreturn
(который должен быть доступен в любой версии nginx), это напрямую останавливает выполнение. Это предпочтительнее в любом контексте.Перенаправьте оба, не-SSL и SSL, на их не-www аналог:
$scheme
Переменная будет содержать толькоhttp
если ваш сервер слушает только порт 80 ( по умолчанию) и слушать вариант не содержитssl
ключевое слово. Неиспользование переменной не принесет вам никакой производительности.Обратите внимание, что вам нужно еще больше серверных блоков, если вы используете HSTS, потому что заголовки HSTS не должны отправляться через незашифрованные соединения. Следовательно, вам нужны незашифрованные серверные блоки с перенаправлениями и зашифрованные серверные блоки с перенаправлениями и заголовками HSTS.
Перенаправить все на SSL (личная конфигурация в UNIX с IPv4, IPv6, SPDY, ...):
Я полагаю, что теперь вы можете представить себе другие соединения с этим паттерном самостоятельно.
Больше моих конфигов? Иди сюда и сюда .
источник
Вы можете узнать, что хотите использовать ту же конфигурацию для большего количества доменов.
Следующий фрагмент удаляет www перед любым доменом:
источник
http
на$scheme
return ...
иrewrite ... last
». Есть ли обновленные ссылки на проблемы с производительностью?Вам нужны два серверных блока.
Поместите это в ваш конфигурационный файл, например
/etc/nginx/sites-available/sitename
Допустим, вы решили использовать http://example.com в качестве основного адреса.
Ваш конфигурационный файл должен выглядеть так:
Первый блок сервера будет содержать инструкции для перенаправления любых запросов с префиксом «www». Он слушает запросы на URL с префиксом «www» и перенаправляет.
Больше ничего не делает.
Второй блок сервера будет содержать ваш главный адрес - URL, который вы хотите использовать. Все остальные настройки идут сюда , как
root
,index
,location
и т.д. Проверьте файл по умолчанию для этих других параметров , которые можно включить в блоке сервера.Серверу нужны две DNS-записи.
Для ipv6 создайте пару записей AAAA, используя ваш-ipv6-адрес.
источник
Вот как это сделать для нескольких имен серверов с www на no-www (я использовал это для поддоменов):
источник
Лучшая практика: отдельно
server
с жёстким кодомserver_name
Лучшая практика с nginx - использовать отдельное
server
перенаправление, подобное этому (не разделяемое сserver
вашей основной конфигурацией), жестко кодировать все и вообще не использовать регулярные выражения.Также может быть необходимо жестко закодировать домены, если вы используете HTTPS, потому что вы должны заранее знать, какие сертификаты вы будете предоставлять.
Использование регулярных выражений в
server_name
Если у вас есть несколько сайтов, и вы не заботитесь о максимальной производительности, но хотите, чтобы у каждого из них была одинаковая политика в отношении
www.
префикса, вы можете использовать регулярные выражения. Лучшая практика использования отдельногоserver
все еще остается в силе.Обратите внимание, что это решение становится сложным, если вы используете https, так как у вас должен быть один сертификат для всех ваших доменных имен, если вы хотите, чтобы это работало правильно.
non-
www
towww
/ regex в отдельном синглеserver
для всех сайтов:www
для non-www
w / regex в выделенном синглеserver
для всех сайтов:www
чтобы неwww
/ regex в выделенном толькоserver
для некоторых сайтов:Может быть необходимо ограничить регулярное выражение, чтобы оно охватывало только пару доменов, тогда вы можете использовать что-то вроде этого только для соответствия
www.example.org
,www.example.com
иwww.subdomain.example.net
:Тестирование регулярных выражений с nginx
Вы можете проверить, работает ли регулярное выражение в
pcretest
вашей системе, как и ожидалось , и это та жеpcre
библиотека, которую ваш nginx будет использовать для регулярных выражений:Обратите внимание, что вам не нужно беспокоиться о конечных точках или регистре, поскольку nginx уже позаботился об этом, согласно регулярному выражению имени сервера nginx, когда заголовок «Host» имеет конечную точку .
Посыпать
if
в существующихserver
/ HTTPS:Это окончательное решение, как правило, не считается лучшей практикой, однако оно все еще работает и выполняет свою работу.
На самом деле, если вы используете HTTPS, то это окончательное решение может оказаться проще в обслуживании, поскольку вам не придется копировать и вставлять целую кучу директив ssl между различными
server
определениями, а вместо этого помещать фрагменты только в необходимые серверы, облегчающие отладку и поддержку ваших сайтов.не
www
дляwww
:www
к не-www
:жесткое кодирование одного предпочтительного домена
Если вы хотите немного большей производительности, а также согласованности между несколькими доменами, которые
server
может использовать один домен, все же может иметь смысл явно жестко кодировать один предпочтительный домен:Ссылки:
источник
Это решение исходит из моего личного опыта. Мы использовали несколько корзин Amazon S3 и один сервер для перенаправления
non-www
наwww
доменные имена в соответствии с политикой заголовка S3 «Host» .Я использовал следующую конфигурацию для сервера nginx :
Это соответствует всем доменным именам, указанным на сервере, начиная с чего угодно, но
www.
и перенаправляет наwww.<domain>
. Таким же образом вы можете сделать обратное перенаправление сwww
наnon-www
.источник
listen 80
вам нужно добавить и директивы,listen 443 ssl
а затем .ssl_certificate
ssl_certificate_key
listen 443 ssl
с отсутствующим сертификатом. Это привычка работать и вызывает некоторую серьезную головную боль.Я объединил лучшие из всех простых ответов, без жестко закодированных доменов.
301 постоянное перенаправление с не-www на www (HTTP или HTTPS):
Если вы предпочитаете не HTTPS, не www, а HTTPS, одновременно перенаправьте www:
источник
Перенаправить не-www на www
Для одного домена:
Для всех доменов:
Перенаправить www на сайт без www для одного домена:
Для всех доменов:
источник
80
и443
?listen
директив (nginx 1.4.6).попробуй это
Другой способ: Nginx без www на www
и с www на no-www
источник
Уникальный формат:
источник
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
источник
$scheme://www.domain.com$1
чтобы избежать двойной косой чертыне уверен, если кто-то заметит, что это может быть правильным, чтобы вернуть 301, но браузеры не хотят делать это
быстрее чем:
источник
Призрачный блог
Для того, чтобы nginx рекомендовал метод для
return 301 $scheme://example.com$request_uri;
работы с Ghost, вам нужно добавить в свой блок главного сервера:источник
Если вы не хотите жестко задавать доменное имя, вы можете использовать этот блок перенаправления. Домен без ведущего www сохраняется как переменная,
$domain
которую можно использовать в операторе redirect.REF: перенаправление поддомен с регулярным выражением в nginx
источник
источник
Если у вас возникли проблемы с этим, вам может понадобиться добавить IP-адрес вашего сервера. Например:
где XXX.XXX.XXX.XXX - это IP-адрес (очевидно).
Примечание: ssl crt и местоположение ключа должны быть определены для правильного перенаправления запросов https
Не забудьте перезапустить nginx после внесения изменений:
источник
/etc/init.d/nginx reload
Вы также можетеreload
сервер, который не вызывает простоев.