Допустим, я хочу перенаправить с www.example.com на example.com и сделать это с помощью nginx. Я огляделся и не увидел хорошей документации по этому поводу, поэтому решил, что задам свой вопрос и отвечу на него.
Я также посмотрел на это в вики 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 поступают запросы, операторы if не используются для повышения производительности. И он использует $ request_uri вместо того, чтобы создавать соответствие $ 1, которое требует перезаписи (см. Страницу Nginx Common Pitfalls).
Источники:
Пожалуйста, посетите этот вопрос в 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) он напрямую останавливает выполнение. Это предпочтительно в любом контексте.
После некоторого поиска и некоторых ошибок вот решение. Проблема, с которой я столкнулся, - обязательно использовать "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;
}
}
}
Чтобы перенаправить на не-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;
}
Тасит.
Кстати, для полной настройки VPS с использованием Nginx ознакомьтесь с Библией VPS на моем сайте, guvnr.com, и я надеюсь, что это удобно!
Вот что я использую:
# ---------------------------------------
# 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
}