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;
}
заметьте, что после первого http: один, а не два слэша (видимо, nginx
канонизирует урлы). В документации написано, что nginx специальным
образом обрабатывает урл справа, начинающийся с "http://". Напоминаю,
что кроме HTTP есть ещё как минимум протоколы https:// и ftp://, не
говоря уж про news, mailto и skype. Сейчас, если я правильно понимаю,
я должен все эти протоколы прописать у себя в редиректах на всех
сайтах.
Что хотелось бы в результате получить:
а) добавление слэша на абсолютный редирект с бэкенда -- это явный баг!
б) "абсолютность" урла нужно проверять, видимо, по регексу ^[a-z]:/* а
не только по строке "http://"
в) хотелось бы, чтобы каким-то образом работало очевидное правило, как
в apache (оно ещё и само собой добавляет query string!).
Спасибо!
--
Алексей Махоткин
http://squadette.ru/