Перезапись Referer по условию
Alex Domoradov
alex.hha at gmail.com
Wed Sep 25 19:41:11 UTC 2013
Привет всем, столкнулся с необходиомстью тестирования подключаемых
шрифтов на сайтах через сервисы typekit.com и fonts.com
Суть сводится к подключению в html коде js скрипта
fonts.com
<script type="text/javascript"
src="http://fast.fonts.net/jsapi/8163d577-49e6-9656-88c9-d8609ff327a1.js"></script>
typekit.com
<script type="text/javascript" src="//use.typekit.net/0cd8xtd.js"></script>
В админке каждого из сервисов прописывается для каких доменов будет
отдаваться данный шрифт, проверка производится по полю Referer.
И вот собственно возникла проблема, необходимости тестирования данных
сайтов из 3х разных мест, при этом в админке должен быть указан только
один реальный домен.
Что на данный момент: каждый раз приходится заходить в админку соотв
сервиса и менять домен. Часто клиент не дает доступов и приходится
дергать его, что очень неудобно.
Хотелось бы избежать подобной ситуации, и в настройках сервисов
прописать только localhost. Для этого я завернул на шлюзе все
обращения к fast.fonts.net (93.184.220.188) и use.typekit.net
(93.184.220.20) на nignx.
# iptables -I PREROUTING -p tcp -s 192.168.0.0/16 -d 93.184.220.20
--dport 80 -j DNAT --to-destination 192.168.1.1:80
# iptables -I PREROUTING -p tcp -s 192.168.0.0/16 -d 93.184.220.188
--dport 80 -j DNAT --to-destination 192.168.1.1:80
Внутри локальной сети подняты два внутр домена, typekit.example.net и
fonts.example.net и соотв следующий конфиг nginx
server {
listen 192.168.1.1:80;
server_name _;
location / {
if ($http_referer ~ '^http://typekit.example.net/') {
set $referer http://localhost;
proxy_pass http://93.184.220.20:80;
}
if ($http_referer ~ '^http://fonts.example.net/') {
set $referer http://localhost;
proxy_pass http://93.184.220.188:80;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Referer $referer;
}
}
И все бы классно, за исключением двух моментов:
1. Многие сайты используют эти сервисы для размещения css, например,
wordpress.org, fonts.com, typekit.com и т.д. Хотелось бы для всех
сайтов, кроме typekit.example.net и fonts.example.net пропускать
запросы без модификаций
2. Необходимо как то сделать исключения для наших внешних тестовых
серверов (с внешними доменными именами). Т.е. например, если
http_referer = project.domain.com, то мы ничего не делаем с запросом,
а просто перенаправляем на соотв сервер (typekit.com или fonts.com)
Читал, что http://wiki.nginx.org/IfIsEvil крайне не желательно
использовать if в Location, может есть более элегантный способ решить
данную задачу?
Подробная информация о списке рассылки nginx-ru