Игнорируя достоинства того, следует ли нам вносить это изменение или нет (обстоятельства несколько сложны и, вероятно, охватываются моим соглашением о неразглашении информации), наш клиент хотел бы, чтобы мы потребовали, чтобы посетители сайта, который мы создаем, пришли с другого из их сайтов. Если пользователь приходит к нам откуда-то еще, он должен быть отправлен на экран входа на этот другой сайт.
Похоже, самый простой способ сделать это - использовать mod_rewrite
для перенаправления чего-либо с помощью реферера, который не является ни нашим сайтом, ни этим другим.
Мое текущее мышление
В httpd.conf
RewriteMap deflector txt:/path/to/deflector.map
RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} =NOT-FOUND
RewriteRule ^ http://www.theothersite.com/login.jsp [R=307,L]
В deflector.map
//www.oursite.com/ -
//oursite.com/ -
//www.theothersite.com/ -
//theothersite.com/ -
Это позволило бы нам легко расширить список «допустимых источников перехода», что кажется хорошей идеей.
Тогда у меня есть три вопроса:
mod_rewrite
(который мы уже активно используем) лучший способ сделать это?307 Temporary Redirect
ответ лучший способ справиться с этим?Мне кажется, что 307 Temporary Redirect
или 403 Forbidden
являются наиболее подходящими коды состояния и я полагаю, что это Плохая вещь ™ - отправлять Location:
заголовок перенаправления с 4xx
ответ.
Все это имеет смысл?
Редактировать: Случай поиска по карте-вчувствительный по умолчанию? Мне нужно беспокоиться о случае здесь?
Изменить 2: Поиск по карте - это поиск по регулярному выражению или совпадение по всему ключу? Если карта содержит www.foo.com
и Referer:
заголовок читает http://www.foo.com/bar.php
будет ли это совпадать?
Я думаю, что карта будет чувствительна к регистру, а также вам нужно извлечь имя хоста из Referer
. Я его вообще не тестировал, но, возможно, что-то вроде этого может сработать:
RewriteMap deflector txt:/path/to/deflector.map
RewriteMap lc int:tolower
RewriteCond %{HTTP_REFERER} ^https?://([^:/?]+)
RewriteCond ${lc:%1} (.+)
RewriteCond ${deflector:%1|NOT-FOUND} =NOT-FOUND
RewriteRule ^ http://example.com/ [L]
Не путайтесь с необычными кодами ответа; значение по умолчанию 302 нормально.
Фактически мы сделали следующее:
RewriteCond %{REMOTE_HOST} !A.B.C.(D|E)
RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?://\1/ [NC]
RewriteCond %{HTTP_REFERER} !https?://referring.domain.com/ [NC]
RewriteRule ^ https://referring.domain.com/path/to/login/script [R,L]
Первый RewriteCond
(и еще несколько подобных строк) означают, что разработчики и клиент не ограничены этой проверкой реферера (так как очень утомительно идти туда, прежде чем перейти на наш сайт).
Второй RewriteCond
это гениальная работа, чтобы проверить, совпадает ли реферер с Host:
в запросе. Это основано на Террис ответ на SO # 7398191: общая проверка реферера mod_rewrite - так как mod_rewrite
выполняет только интерполяцию переменных в тестовой строке, у вас не может быть чтения строки
RewriteCond %{HTTP_HOST} !^https?://%{HTTP_REFERER}/ [NC]
поскольку он просто не будет выполнять эту проверку.
Очевидно, нам «никогда» не нужно будет разрешать другие источники перехода. Если бы мы это сделали, я бы просто установил последний RewriteCond
линия до конца [NC,OR]
и связать еще несколько условий.
Все работает нормально. Спасибо за вашу помощь всем!