NGINX - 301 Редирект Moved Permanently

301 Moved Permanently, редирект, говорящий что ресурс перемещен на постоянной основе. В интернетах пишут что мол типа архинеобходимо для SEO, мол поисковики это дюже уважают), спорить не буду, не вникал. В веб сервере Nginx 301 редирект настраивается в конфигурационном файле ( в apache можно через файл .htaccess ), таким образом:

server {
     listen  80;
     server_name  www.host.ru;
     rewrite ^ http://host.ru$request_uri? permanent; #301 redirect
}

server {
     listen  80;
     server_name .host.ru;
.....
основной конфиг
.....
}

Вот собственно и все, при попадании на http://www.host.ru, получаем 301 редирект на http://host.ru в обратную сторону то-же самое, только пару строк поменять.
Для комплекта, вариант Apache:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.host.com [NC]
RewriteRule ^(.*)$ http://host.com/$1 [L,R=301]

Еще один вариант 301 редиректа для веб сервера Nginx, c http://host.ru/index.php на http://host.ru/

location = /index.php {
    if ($request_uri = /index.php) {
        rewrite ^ http://$host? permanent;#301 redirect
    }
    fastcgi_pass   unix:/tmp/fastcgi.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

location ~ \.php$ {
............
...........
}

Комментарии

Спасибо за инфу. помогли

Подскажите пожалуйста а как сделать редирект с
host.ru:8081
на просто
host.ru а то "один знаменитыйпоисковик" внезапно стал индексировать host.ru:8081 наплевав на директиву host в роботс.тхт

http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#port_in_redirect
либо
http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html#proxy_redirect
не уверен что правильно понял задачу

Здравстуйте!
Не подскажете как сделать редирект на ngnix со страницы без .html на страницу с .html (с page на page.html)
Спасибо.

например так:

location =/page {
rewrite ^ /page.html permanent;
}

Подскажите пожалуйста что можно сделать если на сайте при входе выдает следующее: 301 Moved Permanently

найти откуда этот редирект взялся
если на сервере фронтэндом апач стоит, проверить htaccess, если nginx, то смотреть его конфиг, ну и в конце концов, редирект могут и скрипты выдавать

Отлично!

Добрый день!
Подскажите пож-та, может можно каким нибудь "глобальным" способом прописать редирект?
Вроде как Игорь Сысоев предлагал следующие:
server {
server_name ~^(?!www\.);
rewrite ^ http://www.$host$request_uri permanent;
}

Ноооо у меня версия nginx version: nginx/0.8.54

И данная конструкция не работает, может надо обновится???

Благодарю

можно посмотреть на этот пост Игоря ?
а то либо вы что-то не правильно поняли, либо я

Сергей, добрый день! Спасибо за ответ.
Решение именно Игоря Сысоева в архивах рассылки найти что-то не получается,
но вот люди ссылаются на это решение:
1. http://code-hints.ns-keip.ru/2011/05/301-www-nginx.html
2. http://habrahabr.ru/blogs/sysadm/39801/

Сергей, у меня же суть собственно затык в чем - надо "склеить" два виртуальных домена, ну к примеру
freebsd.ru и www.freebsd.ru. Так вот когда я делаю так:

server {
listen 80;
server_name www.freebsd.ru;
rewrite ^ http://www.freebsd.ru$request_uri? permanent; #301 redirect
}

или так

server {
listen 80;
server_name www.freebsd.ru;
rewrite ^ http://www.freebsd.ru$request_uri;
}

или так
server {
listen 80;
server_name www.freebsd.ru;
rewrite ^(.*) http://www.freebsd.ru$1; или rewrite ^(.*) http://$host$1;
}

возникает множественная переадресация, т.е. редирект производится, НО
браузер тормозит и сообшает о множественной переадресации. Если изменить домен,
ну скажем так:
server {
listen 80;
server_name www.freebsd.ru;
rewrite ^ http://www.ya.ru$request_uri? permanent; #301 redirect
}
То все проходит на ура ))))))))))))))0
Уже второй день борюсь с проблемой и не пойму в чем дело то может быть.
Если сталкивались может подскажите.

так вы не правильно делаете, данный кусок:

listen 80;
 server_name www.freebsd.ru;
 rewrite ^ http://www.freebsd.ru$request_uri? permanent; #301 redirect
 }

делает редирект с www.freebsd.ru, на опять-же www.freebsd.ru, вот и бесконечный цикл
суть в том, что при запросе адреса www.freebsd.ru, запрос редиректился на freebsd.ru ( то есть адрес БЕЗ WWW ), то есть в рабочем виде, этот блок server, должен выглядеть как:

server {
     listen  80;
     server_name  www.freebsd.ru;
     rewrite ^ http://freebsd.ru$request_uri? permanent; 
}

а делее уже идет основнвая секция server для домена freebsd.ru ( без WWW )

server {
     listen  80;
     server_name freebsd.ru;
...
} 

Да тут я допустил ошибку, но у меня и этот код почему то не работает:
(мне надо чтобы редиректило на www)
server {
listen 80;
server_name freebsd.ru;
rewrite ^ http://www.freebsd.ru$request_uri? permanent;
}

Сергей в общем я сделал по другому, хотя поэксперементировать бы надо будет.
Вот рабочий вариант мой, ну это не совсем то что надо, но все же работает хоть так ))))

server_name www.freebsd.ru freebsd.ru *.freebsd.ru;
if ($http_host = freebsd.ru) {
rewrite (.*) http://www.freebsd.ru$1 permanent;
}
ОГРОМНОЕ СПАСИБО за советы

Если нужен редирект с домена без www на домен с www, то в server_name долже быть только домен с www, т.е. так

server_name www.freebsd.ru;

Эта конструкция
if ($http_host = freebsd.ru) {
rewrite (.*) http://www.freebsd.ru$1 permanent;
}

повторяет(не красиво)

server {
listen 80;
server_name freebsd.ru;
rewrite ^ http://www.freebsd.ru$request_uri? permanent;
}

можно смело удалить

а не проще записать в сервер оба имени и не пользоваться редиректом?

server {
 listen 80;
 server_name freebsd.ru www.freebsd.ru;
 }

Спасибо!

А вы сталкивались с подобными редиректами?

set $curr "eur"; //записываю в переменную евро

if ($http_cookie ~* "curr=b") { //проверяю наличие куки на баксы (не работает в мозиле и опере в других пашет)
set $curr "usd"; //записываю в переменную баксы
}
if ($http_cookie ~* "curr=r") { //проверяю наличие куки на бубли (не работает в мозиле и опере в других пашет)
set $curr "rur"; //записываю в переменную бубли
}
if ($request_uri !~* "(rur|usd|eur)") { //проверяю на наличие в пути переменной валюты чтобы не зациклить
rewrite ^(.*)$ $1?curr=$curr permanent;
}

Происходит следующее:
Заходим на страницу в первый раз:
site.ru/ddd

редиректе на:
site.ru/ddd?curr=eur - правильно

меняем валюту, записывая в куки бубли, у хрома и яшы редиректит на:
site.ru/ddd?curr=rur
у мозилы и оперы оставляет на предыдущей странице

переходим на:
site.ru/fff

у всех редиректит на:
site.ru/fff?curr=rur - правильно

переходим на:
site.ru/ddd

соответственно у оперы и мозилы редиректит на:
site.ru/ddd?curr=eur
а у хрома и яшы на:
site.ru/ddd?curr=rur

Сможете помочь решить эту задачу, или подскажите другие пути? Нужен как не сложно догадаться для сайта с мультивалютной системой а именно для модуля кэширования, которому чтобы по разному закэшировать разное представление страниц записи в куки недостаточно, а нужен специфичный адрес.

Здравствуйте, нужна помощь. Сайт сделан на Ajax и имеет адрес типа http://www.site.ru/#!/page_1 . Символ #! яндекс преобразует в параметр ?_escaped_fragment_= . Как сделать, чтобы страницы типа http://www.site.ru/?_escaped_fragment_=/page_1#!/ (page_1 -разные страницы на сайте) переходили на страницы вида http://www.site.ru/#!/page_1

Добрый день, помогите, не могу определиться!
есть сайт который имеет около 20-ти страниц, типа http://www.sait.ru/produkt.html
все страницы находятся в корневом каталоге в формате HTML , но когда нужно что то менять на сайте, например номер телефона, то приходится редактировать все страницы сайта.
поэтому решил создать базу данных на PHP-mysql.
но страницы удается назвать в PHP-mysql. только таком виде
типа http://www.sait.ru/produkt/
програма php установлен на хостинге PHP5.2.10 и rewrite_module включен.
требуется профессиональный помощи.
как правильно настроит редирект от старых адресов типа produkt.html на новые адреса, типа /produkt/ при этом сохранить все возможные привилегии от поисковиков?.
старые адреса типа produkt.html , будут удалены из корневого каталога, сразу после создании в базе данных новых адресов, типа /produkt/ .
пожалуйста, еще вопрос: если будут меняться названии страницы таким образом
например
produkt.html превратится на /produkt/
catalog.html превратится на /catalog/
(их 20штук и все они разные)
то можно написать редирект один раз для всех страниц ? или же придется писать для всех страниц по отдельности ?

Возник еще вопрос тоже немало важный.
почему то когда открываешь в строке поиске любые страницы, которая нет в базе данных, открывается шаблон страницы без контента
пример
типа http://www.sait.ru/pro/ или же типа http://www.sait.ru/drt/
в общем если написать любое слово или несколько любых букв между слешами, открывается шаблон без контента,
еще пример для динамических сайтов
http://www.sait.ru/index.php?page=1000
если на место 1000 написать любые цифры которая не находится в базе данных, открывается также пустой шаблон сайта.
вопросы :
1.эти моменты на сколько негативно влияет на раскрутку сайта ??
2.можно ли настроить хтаксес так, чтобы при поиске этих страниц открывались 404 ошибка ??
3. Или же эти проблемы не решается через файл хтаксес?

Заранее спасибо !

Добрый день!
Вы можете оставить страницы так как есть: produkt.html, но вписать в них php-код и разрешить серверу выполнять php-код в html файлах.

.htaccess

AddType application/x-httpd-php .php .html .htm .ptpl .tpl

А так же можно создать отдельный файл, например: contacts.html и в него списать номера телефонов, адреса и потом просто подключить этот файл в основные страницы.

<?php include("contacts.html"); ?>

Когда изменится номер телефона или адрес, то нужно будет отредактировать только один файл contacts.html и эти изменения будут видны на всех страницах сайта

спасибо.

Подскажите как переадресовать с одной директории на сайте на другую.
Т.е. с site.ru/dir1/432/ на site.ru/dir2/432/

Приветствую Вас, у меня вот такая проблема. Решили мы поменять доменное имя у сайта, на сервере nginx работает в связке с apache и поэтому возникло пару вопросов:

1. Где лучше делать ридерект, в apache или в nginx?
2. Пробовали в nginx, но там проблема, дело в том, что когда произвели изменение в nginx.conf сайт перестал загружаться, вместо контента он выдавал сообщение от nginx.

Вот как делал, может просто допустил ошибку:

##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;

server {
listen 80;
server_name fg-fan.ru www.fg-fan.ru;
access_log off;
root /home/gagen/www/fg-fan.ru;
charset utf8;

location / {
index index.php;
proxy_pass http://78.140.189.197:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|docx|odt|7z|avi|mpeg|mpg|mp3|ogg|mov)$ {
#limit_req zone=one burst=30;
error_page 404 = @fallback;
}

и т.д. и т.п.

вот что сделал для того, чтобы сайт открывлся на новом домене fox-fan.ru, после чего сайт перестал грузиться:

##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;

server {
listen 80;
server_name fg-fan.ru www.fg-fan.ru;
rewrite ^ http://www.fox-fan.ru$request_uri? permanent; #301 redirect
access_log off;
root /home/gagen/www/fg-fan.ru;
charset utf8;

location / {
index index.php;
proxy_pass http://78.140.189.197:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|docx|odt|7z|avi|mpeg|mpg|mp3|ogg|mov)$ {
#limit_req zone=one burst=30;
error_page 404 = @fallback;
}

Помогите, человеку которой мне поможет в решении данной проблемы 100р. на счёт телефона ))

Народ а модуль rewrite_module самому надо устанавливать?

он по деолту стоит

вот так писать неправильно:
RewriteCond %{HTTP_HOST} ^www.host.com [NC]

замените на

RewriteCond %{HTTP_HOST} ^www\.host\.com [NC]

точки должны быть экранированы, так как в контексте регулярных выражений имеют особое значение

в htaccess,это не имеет значения, насколько я знаю

Помогите пожалуйста с настройкой реврайта.
Есть сайт с форумом в каталоге example.com/forum/ есть необходимость перевести его на поддомен forum.example.com/ Сейчас имею такую запись в конфиге

location /forum {
rewrite ^(.*)$ http://forum.example.com$request_uri redirect;
}

request_uri в данном случае получается например /forum/members/ и как следствие переадресовывает на forum.example.com/forum/members/ что дает 404 в ответе.
Собственно вопрос в том как настроить правильно редирект чтобы при обращении к forum/members/ перекидывало на forum.example.com/members/ ??
Спасибо!

так а субдомен forum.example.com физически существует ? блок server для него есть ?

Да, конечно существует. И в конфиге для него server {} присутствует.

посмотрите в сторону регулярки в location, что-бы передавать не request_uri а переменную из части урла, после /forum/
с ходу не подскажу, нужно пробовать
http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html#rewrite

Спасибо за наводку. Будем пробовать.

Вроде чуть разобрался.
Получилось вот такое

location /forum/ {
rewrite_log on;
if (!-f $request_filename) {
rewrite (/forum)/([a-z\i].*) http://forum.vahtubinske.ru/$2 redirect;
}
rewrite (/forum)/(forum|topic)/(\d*\-[a-z0-9\i].*) http://forum.$http_host/$2/$3 redirect;
rewrite (/forum)/(index.php)(\?[a-z0-9\i].*) http://forum.$http_host/$2/$3 redirect;
}

собственно все перенаправляется, но вот крайний реврайт не срабатывает. Он по идее написан вот для такого запроса
http://example.com/forum/index.php?app=ibEconomy
Помогите разобраться почему он не работает?

Подскажите пожалуйста как в ngnix убрать слэш на конце ссылки с расширением?

Есть такие страницы

/catalog/product1/ - у них слэш должен оставаться

а вот у таких

/catalog/*.php/
/catalog/*.htm/
/catalog/*.html/- сделать редирект, то есть убрать слэш

а не проще найти откуда они берутся, чем делать кучу лишних редиректов ?

пытаюсь закрыть от злого умысла, везде по СЕО на этом заостряют внимание.

Подскажите, пожалуйста, как в nginx прописать такое правило?

+RewriteBase /
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^(.*)/$ $1 [L,R=301]

т.е. замена всех url страниц с "/" на без "/", кроме главной!

Пример:

  • http://sitename.com/files/ -> http://sitename.com/files
  • http://sitename.com/files/audio/ -> http://sitename.com/files/audio

Заранее благодарю.

location / {
rewrite ^/(.*)/$ /$1 permanent;
}

Здравствуйте.
Есть сайт, который находится в разработке.
На сегодня доступ к нему из Интернета закрыт для всех IP-адресов, кроме одного компа в локальной сети.
С этой целью в конфигурации nginx имеется такая запись:

allow 127.0.0.1;
allow 192.168.0.25;
deny all;

Но есть необходимость показать потенциальным пользователям, что сайт как-бы существует.

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

Как организовать это средствами nginx?

Заранее благодарю за ответ!

Подскажите.
Есть два случая.

1) все статьи с /helper/ переехали в /topic/helper/

2) при обращении к любой странице типа page.html/, page.html? переадресовывать на page.html

спасибо

Подскажите как организовать редирект 301 с ссылкой в которой есть пробел (20%) или _

rewrite (/test.ru/test/Cala-D-%60-Or/) http://test2.ru/ permanent; - не работает (

добрый день мне нужно сделать 227 редиректов в nginx
c разных урлов и поодменов я могу сделать это в одном файле ? конфига
домены например
de.site.com/bla/12 ---- site.ru/bla
en.site.com/13 ---- site.com/12
подскажите как ?

Буду благодарен, если подскажете почему это правило:
if ($query_string ~ "replytocom="){
rewrite ^(.*)$ $1 redirect;
}
делает редирект и передаёт параметры. Всё перерыл, не пойму. Например
такой url
]]>http://site.ru/post/?replytocom=6]]>
останется таким же (бесконечная переадресация), а не
]]>http://site.ru/post/]]>
как ожидалось

Даже если вместо $1 написать /abrakadabra/ то получи переадресацию на /abrakadabra/?replytocom=6

Откуда и почему он цепляет аргументы?

Буду благодарен, если подскажете почему это правило:
if ($query_string ~ "replytocom="){
rewrite ^(.*)$ $1 redirect;
}
делает редирект и передаёт параметры. Всё перерыл, не пойму. Например
такой url
]]>http://site.ru/post/?replytocom=6]]>
останется таким же (бесконечная переадресация), а не
]]>http://site.ru/post/]]>
как ожидалось

Даже если вместо $1 написать /abrakadabra/ то получи переадресацию на /abrakadabra/?replytocom=6

Откуда и почему он цепляет аргументы?

Сработало! Спасибо за рецепт.
Кстати прикольная капча))

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
Регистр имеет значение
  .o8           oooo                                           .o   
"888 `888 .d88
888oooo. 888 .oooo.o oooo ooo .oooooooo .d'888
d88' `88b 888 d88( "8 `88. .8' 888' `88b .d' 888
888 888 888 `"Y88b. `88..8' 888 888 88ooo888oo
888 888 888 o. )88b `888' `88bod8P' 888
`Y8bod8P' .o. 88P 8""888P' .8' `8oooooo. o888o
`Y888P .o..P' d" YD
`Y8P' "Y88888P'
Введите код, изображенный в стиле ASCII-арт.