Nginx убрать двойное перенаправление 301

S
На сайте с 28.01.2018
Offline
19
1309

Всем привет! Есть конфиг. Недавно привязал дроп zerkalo1.ru к основному домену. Хочется настроить правильный 301 редирект. С данным конфигом он выполняется в 2 этапа, вот пример:

zerkalo1.ru/1.html редиректится вначале на site1.ru/1.html

и только потом на site1.ru (главная)

В браузере это не заметно. Но Яндекс бот видит двойной 301-ый редирект, имхо, это ни есть гуд для него?

Собстна вопрос: как это исправить? Чтобы уже несуществующие внутренние страницы зеркала редиректились прямиком 301 на главную основного.

Спасибо!


server {

listen 443 ssl http2;

server_name zerkalo1.ru www.zerkalo1.ru www.site1.ru site1.ru;

if ($http_host !~ "site1.ru"){
rewrite ^ https://site1.ru$request_uri permanent;
}

if ($http_host = "www.site1.ru"){
rewrite ^ https://site1.ru$request_uri permanent;
}

if ($ssl_protocol = "") {rewrite ^ https://site1.ru$request_uri? permanent;}

root '/www/site1/';
include /etc/nginx/conf.d/common.inc;
error_page 400 401 403 404 500 =301 /;
rewrite ^/page/(.*)$ /index.php?cstart=$1 last;


# Указываем пути к сертификатам
ssl_certificate /etc/letsencrypt/live/site1.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site1.ru/privkey.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;

# позволяем серверу прикреплять OCSP-ответы, тем самым уменьшая время загрузки страниц у пользователей
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

location ~ /.well-known {
allow all;
}


location / {

try_files $uri $uri/ =404;

rewrite "^/([^.]+)/page/([0-9]+)" /index.php?do=cat&category=$1&cstart=$2 last;
rewrite "^/([^.]+)(/?)+$" /index.php?do=cat&category=$1 last;
index index.php index.html index.htm;
include /etc/nginx/conf.d/common-loc.inc;
}


rewrite ^(.*)/rss.xml$ /404.php last;
rewrite ^/video/(.*)-([0-9]+)+$ /index.php?newsid=$2 last;



location /tags/ {
rewrite ^/tags/([^/]*)(/?)+$ /index.php?do=tags&tag=$1 last;
rewrite ^/tags/([^/]*)/page/([0-9]+)(/?)+$ /index.php?do=tags&tag=$1&cstart=$2 last;
include /etc/nginx/conf.d/common-loc.inc;
}

location /user/ {
rewrite ^/user/([^/]*)/rss.xml$ /engine/rss.php?subaction=allnews&user=$1 last;
rewrite ^/user/([^/]*)(/?)+$ /index.php?subaction=userinfo&user=$1 last;
rewrite ^/user/([^/]*)/page/([0-9]+)(/?)+$ /index.php?subaction=userinfo&user=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/news(/?)+$ /index.php?subaction=allnews&user=$1 last;
rewrite ^/user/([^/]*)/news/page/([0-9]+)(/?)+$ /index.php?subaction=allnews&user=$1&cstart=$2 last;
rewrite ^/user/([^/]*)/news/rss.xml(/?)+$ /engine/rss.php?subaction=allnews&user=$1 last;
include /etc/nginx/conf.d/common-loc.inc;
}

location /newposts {
rewrite ^/newposts(/?)+$ /index.php?subaction=newposts last;
rewrite ^/newposts/page/([0-9]+)(/?)+$ /index.php?subaction=newposts&cstart=$1 last;
include /etc/nginx/conf.d/common-loc.inc;
}

location /favorites {
rewrite ^/favorites(/?)+$ /index.php?do=favorites last;
rewrite ^/favorites/page/([0-9]+)(/?)+$ /index.php?do=favorites&cstart=$1 last;
include /etc/nginx/conf.d/common-loc.inc;
}

location ~ \.(html|xml|htm) {

rewrite "^/(.*).htm(/?)+$" / permanent;
rewrite "^/([^.]+)/(.*).html(/?)+$" / permanent;
rewrite "^/([^.]+)/([^.]+)/(.*).html(/?)+$" / permanent;
rewrite "^/([^.]+)/([^.]+)/([^.]+)/(.*).html(/?)+$" / permanent;
rewrite "^/([^.]+)/([^.]+)/([^.]+)/([^.]+)/(.*).html(/?)+$" / permanent;



try_files $uri $uri/ =301;
error_page 301 /;



rewrite "^/([^.]+)/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$4&news_page=$2&cstart=$3 last;
rewrite "^/([^.]+)/page,([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$3&news_page=$2 last;
rewrite "^/([^.]+)/([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$2 last;
rewrite "^/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$3&news_page=$1&cstart=$2 last;
rewrite "^/page,([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$2&news_page=$1 last;
rewrite "^/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$" /engine/print.php?news_page=$1&newsid=$2 last;
rewrite "^/([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$1 last;
rewrite "^/static/(.*).html(/?)+$" /index.php?do=static&page=$1 last;
rewrite ^/rules.html$ /index.php?do=rules last;
rewrite ^/statistics.html$ /index.php?do=stats last;
rewrite ^/addnews.html$ /index.php?do=addnews last;
rewrite ^/([^.]+)/rss.xml$ /engine/rss.php?do=cat&category=$1 last;
rewrite ^/page,([0-9]+),([^/]+).html$ /index.php?do=static&page=$2&news_page=$1 last;
rewrite ^/print:([^/]+).html$ /engine/print.php?do=static&page=$1 last;
rewrite ^/rss.xml$ /engine/rss.php last;
rewrite ^/([^/]+).html$ /index.php?do=static&page=$1 last;
include /etc/nginx/conf.d/common-loc.inc;
}

location /mp4 {
internal;
mp4;
}

location ~ \.mp4$ {
mp4;
limit_rate 500K;
}

location ~* \.(jpg|jpeg|gif|png|ico|swf|css|js)$ {
try_files $uri $uri/ =404;
error_page 404 /404.php;
expires 30d;
add_header Cache-Control public;
}

location ~* \.(.*)$ {
try_files $uri $uri/ =404;
error_page 404 /404.php;
}

}
S
На сайте с 30.09.2016
Offline
469
#1
Sheffff:
Чтобы уже несуществующие внутренние страницы зеркала редиректились прямиком 301 на главную основного.

То есть со всех страниц "зеркала" - редирект на главную? Тогда так

		if ($http_host !~ site1\.ru){
rewrite ^ https://site1.ru permanent;
}
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
S
На сайте с 28.01.2018
Offline
19
#2
Sitealert:
То есть со всех страниц "зеркала" - редирект на главную? Тогда так
		if ($http_host !~ site1\.ru){

rewrite ^ https://site1.ru permanent;
}

Да, спасибо, я в курсе этой штуки, но исходя из рекомендаций гугла и яндекса, не есть гуд, когда целиком домен привязывается на 1 стр. То есть, бот должен при этом видеть и ходить по внутренним зеркала, которые выдавали бы 301 на соответствующие внутренние основного сайта.

redeyer
На сайте с 27.01.2010
Offline
102
#3
Sheffff:
Да, спасибо, я в курсе этой штуки, но исходя из рекомендаций гугла и яндекса, не есть гуд, когда целиком домен привязывается на 1 стр. То есть, бот должен при этом видеть и ходить по внутренним зеркала, которые выдавали бы 301 на соответствующие внутренние основного сайта.

Ну в вашем же конфиге так и настроено. А как вы тут хотите тогда от двойного редиректа избавиться? Если бот сначала должен попасть на несуществующую страницу основного, а потом ещё и на главную основного. Либо вариант от Sitealert используйте - будет вам один редирект с каждой страницы зеркала сразу на главную основного. Либо показывайте по урлам зеркала на основном сайте 404, тоже будет один редирект, упирающийся в 404 на основном сайте.

Услуги сисадмина. Настройка и оптимизация VPS https://searchengines.guru/ru/forum/928318 . Поднятие своих прокси, восстановление сайтов из вебархива. Мой канал о хостингах https://t.me/hostingexpert
IL
На сайте с 20.04.2007
Offline
435
#4
redeyer:
А как вы тут хотите тогда от двойного редиректа избавиться?

В конфиг nginx-а прописать все существующие страницы.. =)

Ну.. или хотя бы максимально regexp-ами прикрыться..

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
S
На сайте с 28.01.2018
Offline
19
#5
ivan-lev:
Ну.. или хотя бы максимально regexp-ами прикрыться..

+

Я не до конца понимаю иерархию и логику переадресаций. Возможно, чтобы несколько внутрисерверных переадресаций было, до выдачи ответа клиенту?

В общем, цели следующей хочу добиться: всё, что не генерит CMS выдавать 301.

L
На сайте с 10.02.2015
Offline
245
#6


location ~ \.(html){
set $redirect_root 0;
if ($http_host !~ "domain.com"){
set $redirect_root 1;
}

if (!-e $request_filename) {
set $redirect_root "${redirect_root}2";
}

if ($redirect_root = 12) {
rewrite ^ https://domain.com/;
}
}
IL
На сайте с 20.04.2007
Offline
435
#7
Sheffff:
В общем, цели следующей хочу добиться: всё, что не генерит CMS выдавать 301.

Так выдавайте..

А как nginx до передачи запроса "куда надо" узнает, что генерит CMS?? =)

S
На сайте с 28.01.2018
Offline
19
#8
ivan-lev:
Так выдавайте..
А как nginx до передачи запроса "куда надо" узнает, что генерит CMS?? =)

Да, спасибо, понял)

Ещё почитал док по гуглу, они пишут, что бот норм смотрит на двойной редирект, даже на тройной.

Вопрос считаю решённым, всем спасибо :)

L
На сайте с 10.02.2015
Offline
245
#9

Лучше так.

Разделите server на 2.

В первом укажите хосты, с которых нужно редиректить.

В первом оставьте только root и настройки https.

Во втором уберите эти хосты.

Конфиг первого (нужно добавить ssl):


server {
listen 80;
server_name mirror.com;

location ~ \.(html) {
if (!-e $request_filename) {
rewrite ^ https://domain.com/ permanent;
}

rewrite ^(.*)$ https://domain.com/$1 permanent;
}

root /www/domain;
}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий