редиректы на полный урл

Igor Sysoev is at rambler-co.ru
Tue Jul 24 13:13:07 MSD 2007


On Tue, Jul 24, 2007 at 01:00:10PM +0400, Alexey Mahotkin wrote:

> nginx 0.5.26 из Fedora 7.
> 
> я использую простенький трекер редиректов на своих блогах -- все
> ссылки на внешние сайты (например, http://www.microsoft.com/)
> заменяются на
> 
> /r/http://www.microsoft.com/  и при клике на этот урл происходит
> прозрачный для пользователя редирект, с оставлением записи в логе
> сайта.
> 
> Под апачем всё работало очевидным образом:
> 
> RewriteRule /r/(.*) $1 [R]
> 
> 
> После переключения на nginx с бэкендовым апачем всё сломалось, а
> именно nginx, несмотря на то, что ему приходит от бэкенда абсолютный
> урл в редиректе, добавлял к нему слэш, в результате получалось
> http://2read.ru/http://www.microsoft.com/

Я не понял, о каком слэше идёт речь.

> Я заборол это на фронтенде, но результат получился не совсем, на мой
> взгляд, очевидный:
> 
>                location /r/ {
>                        rewrite ^/r/http:/(.*)$ http://$1 break;
>                }

break здесь не нужен, так редирект сам прерывает исполнение.

> заметьте, что после первого http: один, а не два слэша (видимо, nginx
> канонизирует урлы).  В документации написано, что nginx специальным

Да, // > /.

> образом обрабатывает урл справа, начинающийся с "http://".  Напоминаю,
> что кроме HTTP есть ещё как минимум протоколы https:// и ftp://, не
> говоря уж про news, mailto и skype.  Сейчас, если я правильно понимаю,
> я должен все эти протоколы прописать у себя в редиректах на всех
> сайтах.

Нет:

    rewrite ^/r/http:/(.*)$  skype://$1 redirect;

> Что хотелось бы в результате получить:
> 
> а) добавление слэша на абсолютный редирект с бэкенда -- это явный баг!

Пока не вижу :)

> б) "абсолютность" урла нужно проверять, видимо, по регексу ^[a-z]:/* а
> не только по строке "http://"

... redirect;

> в) хотелось бы, чтобы каким-то образом работало очевидное правило, как
> в apache (оно ещё и само собой добавляет query string!).

query string добавляется.

Если она не нужна, то

    rewrite ^/r/http:/(.*)$  skype://$1?  redirect;


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list