Как настроить 301 редирект (redirect) при помощи Nginx на VPS
Чтобы сделать редирект с помощью nginx, необходимо изменить файл конфигурации nginx.conf.
Если у вас настроены виртуальные хосты, файл конфигурации для каждого хоста нужно редактировать отдельно.
Редирект добавляется в секцию server в конфигурационном файле. Пример редиректа на https:
Редирект с http на https-протокол
Если у вас подключен SSL-сертификат для домена, вам необходимо настроить https-протокол. Для редиректа с http на https в файл конфигурации необходимо добавить следующий код:
server {
#...
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
#...
}
Редирект с https на http-протокол
Обратный пример конфигурации для редиректа с https на http:
server {
#...
server_name yourdomain.ru www.yourdomain.ru;
return 301 http://$server_name$request_uri;
#...
}
Редирект с www на без www
server {
#...
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
#...
}
Редирект с без www на www
server {
#...
if ($host ~* ^[^.]+\.[^.]+$) {
rewrite ^(.*)$ $scheme://www.$host$1 permanent;
}
#...
}
Редирект для одной страницы
Если у вашей страницы изменился адрес, необходимо сделать 301 редирект на новый URL.
server {
#...
if ( $request_filename ~ oldpage.html/ ) {
rewrite ^ newpage.html permanent;}
#...
}
Где oldpage.html — имя страницы с которой будет происходить редирект, а newpage.html имя страницы, на которую будет осуществляться редирект.
Редирект для папки
server {
#...
if ( $request_filename ~ oldfolder/.+ ) {
rewrite ^(.*) newfolder/$1 permanent; }
#...
}
Где oldfolder — имя старой папки, а newfolder — имя новой папки
Редирект с одного домена на другой
Чтобы осуществить редирект с одного домена на другой, необходимо добавить:
server {
#...
rewrite ^ $scheme://www.new-yourdomain.ru;
#...
}
Где www.new-yourdomain.ru — домен, куда будет осуществляться редирект.
Редирект на страницу без слеша в конце URL
server {
#...
rewrite ^/(.*)/$ /$1 permanent;
#...
}
Редирект на страницу со слешем в конце URL
server {
#...
rewrite ^(.*[^/])$ $1/ permanent;
#...
}
Перезагрузите Nginx
После внесения изменений в файл конфигурации для домена необходимо перезапустить nginx. Для перезапуска выполните следующую команду:
service nginx restart
Проверить корректность конфигурационного файла можно с помощью команды: nginx -t
Откройте для себя возможности виртуального выделенного сервера на SSD.
Подробнее Помогла ли вам статья? 2
раза уже
помогла
Redirect 301 с веб-ресурса «www» на сайт без учета «www» и обратно
Очень часто появляется необходимость в использовании редиректов. К наиболее распространенным ситуациям, в которых задействуется 301 Redirect можно отнести:
- случаи, когда страница сменила адрес, а пользователи осуществляют запрос на старую;
- исключение дублей страниц;
- переезд с одного сайта на другой со сменой доменного имени.
Самым верным решением в подобных ситуациях будет реализация редиректа во фронтэнде, посредством NGINX. В идеале рекомендуется отказаться от Appache и использования .htaccess в принципе, если есть желание существенно ускорить работу сайта в целом.
Однако в таком случае, при переходе на NGINX, мы сразу же сталкиваемся с проблемой реализации ранее создававшихся .htaccess редиректов. Рассмотрим несколько эффективных способов организации редиректов в NGINX.
Redirect 301 с веб-ресурса «www» на сайт без учета «www» и обратно
Проверенный способ в данном случае — реализация редиректа на уровне server-директивы.
sеrver {
listеn 80;
sеrver_nаmе sitе.com;
rеwrite ^ http://www.site.com$requеst_uri? pеrmanent;
}
sеrver {
listen 80;
sеrver_nаme www.sitе.com;
. . .Редирект со включенным режимом ЧПУ
Это очень популярный способ, поскольку, смена адресов страниц происходит и в работающих проектах, а это чревато потерей определенного количества посетителей сайта. В поисковых системах все еще красуется старое приветствие, на веб-сайте – новое, что вводит пользователя в замешательство.
Этот способ перенаправления можно отнести к разряду непростых, поскольку здесь условие содержится в переменных запроса GET. Не совсем понятно, каким образом создавать Location по такому запросу
/dir/?ELЕMENT_ID=777 на /dir/777/.
Есть достаточно эффективный, хотя и не самый удобный, вариант, поскольку присутствие условия «if» в конфигурации NGINX считается не самым удачным решением априори. Но, тем не менее, он работает и работает вполне стабильно:
lоcation ~ /dir/ {
if ( $аrgs ~* (.*)ELEMENT_ID=(.*) )
{
sеt $element_id $2;
set $args »;
rеwrite ^(.*)$ /dir/$ELЕMENT_ID/ pеrmanent;
}
prоxy_pаss $prоxyserver;
}Перенаправление несуществующих файлов в index.php
Этот индекс в последствии можно использовать при работе со многими популярными CMS, такими как Joomla!, например.
lоcation / {
try_files $uri $uri/ /indеx.php$is_args$аrgs;
}
lоcation ~ \.php$ {
fаstcgi_index index.php;
includе fastcgi_params;
. .Редиректим пользователей с одной конкретной страницы на другую
lоcation = /pricе.html { rewrite ^(.*)$ /pricе.php; }
Второй более простой способ
rewrite ^/cat/page/$ http://www.example.net/page2/ permanent;
Перенаправление 301 с передачей переменной /оbl/777/ на /оbl.php?obl_idx=777 по условию
lоcation /obl/ { rеwrite /оbl\/(.*)$ /оbl.php?obl_idx=$1; }
Как сделать редирект на Nginx без смены url в браузере? — Хабр Q&A
Добрый день.Возникла необходимость сделать следующее: есть два сайта site.ru, service.ru, оба на одном сервере). нужно сделать редирект (без изменения url в браузере) такого вида:
site.ru/param1/value1/param2/value2… -> service.ru/site?url=param1/value1/param2/value2&site_id=1
На apache это решается довольно просто (.htaccess для site.ru):
RewriteRule ^(.*)$ http://service.ru/site?url=$1&site_id=1 [P]
# И для статики
RewriteRule ^img/(.*\.(eot|font.css|otf|ttc|ttf|woff|js|png|jpg|jpeg|gif))$ http://service.ru/static/1/img/$1 [P]
Но проблема в том, что service.ru и остальные сайты крутятся на nginx, настроенным на 80 порт.
Директива rewrite, как я понял, работает только с изменением url. С проксированием толком не смог разобраться.
Развернуть apache как фронтенд для nginx’a (как бы страшно это не звучало), как я понимаю возможно только на 8080, или какой-нибудь другой, не 80 порт. Поскольку на 80 уже nginx и убрать его оттуда нет возможности… только если переводить на apache все остальные сайты, чего бы хотелось избежать…
UPD Убив пол дня, получилось только довольно костыльное решение:
site.ru:80 (Nginx)
server {
listen 80;
server_name site.ru www.site.ru;
access_log /var/log/nginx/test1.access.log;
error_log /var/log/nginx/test1.error.log;
location / {
proxy_pass http://site.ru:8080;
}
}
site.ru:8080 (Apache)
AddDefaultCharset utf-8
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*)$ http://service.ru/site?url=$1&site_id=1 [P]
# И для статики
RewriteRule ^img/(.*\.(eot|font.css|otf|ttc|ttf|woff|js|png|jpg|jpeg|gif))$ http://service.ru/static/1/img/$1 [P]
То есть следующая цепочка: site.ru (nginx) -> site.ru:8080 (apache) -> service.ru (nginx).
Вроде работает, но боюсь представить, как это скажется на производительности 🙂
Как отключить редирект nginx с http на https? — Хабр Q&A
Вот конфиги /etc/nginx/nginx.conf:http {
log_format ispmgrnode '$server_name $request_length $bytes_sent';
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 100M;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/vhosts/*/*;
server {
server_name localhost;
disable_symlinks if_not_owner;
include /etc/nginx/vhosts-includes/*.conf;
client_max_body_size 100M;
location @fallback {
error_log /dev/null crit;
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://127.0.0.1:8080 /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
listen 80;
listen *.*.*.*:80 default_server;
}
server {
server_name localhost;
disable_symlinks if_not_owner;
include /etc/nginx/vhosts-includes/*.conf;
location @fallback {
error_log /dev/null crit;
proxy_pass http://127.0.0.1:8080;
proxy_redirect http://127.0.0.1:8080 /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
add_header Strict-Transport-Security "max-age=31536000;";
listen *.*.*.*:443 default_server;
ssl on;
ssl_certificate "/usr/local/mgr5/etc/nginx_certs/default_srv.crtca";
ssl_certificate_key "/usr/local/mgr5/etc/nginx_certs/default_srv.key";
ssl_ciphers HIGH:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!EXP:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
}
Что нужно изменить/добавить чтобы сайт открывался и в http и в https?