Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как я могу определить, была ли страница запрошена через перенаправление?

Автор вопроса: G BerdalОтветов: 6

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

  1. Все редиректы - это 301 редиректы. Из-за правил SEO следует избегать добавления индикаторов. (Google индексирует URL-адреса со значениями отдельно)

  2. Я пытался проверить все переменные среды, но все они пусты (что считается нормальным), и в этом отношении внутренние перенаправления ничем не отличаются (я считаю).

  3. Обнаружение должно происходить в режиме реального времени, поэтому файлы журналов не подходят.

Процесс вкратце, параметры регистрируются в файлах cookie через скрипт, затем он 301 перенаправляет на страницу, где контент управляется файлами cookie. Пока файлы cookie зарегистрированы, их содержимое не изменится на исходное, если кто-то повторно наберет адрес в адресной строке.

Я надеюсь это имеет смысл.

РАНЬШЕ: я думал о кодах состояния, но я не уверен, есть ли способ прочитать это на целевой странице или нет. (Мы выяснили, что это не сработает)

  • Это не имеет ничего общего с кодами состояния, отправляемыми веб-сервером клиенту. Этот код исчезает к тому времени, когда клиент запрашивает страницу, которая является целью перенаправления. Sinan Ünür 24.07.2009
  • Ага. Я боялся, что ты это скажешь. :) G Berdal 24.07.2009

httpredirectheader

Ответы

Ответ 1 · рейтинг 5 · Sinan Ünür

Как насчет:

my $cgi = CGI->new;

print $cgi->redirect(
    'http://example.com/this/page/that.html?redirect=yes'
);

Какой бы механизм вы ни использовали для различения перенаправлений, вы можете посмотреть строку запроса, чтобы принять решение. Конечно, это не мешает пользователям добавлять URL-адрес в закладки с помощью redirect=yes и т. д.

Вы можете попробовать заголовок referer, но у него есть свои проблемы.

Ответ 2 · рейтинг 5 · brian d foy

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

Вы не говорите, какую проблему вы пытаетесь решить или почему этот бит важен. Какую проблему ты пытаешься решить?

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

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

  2. Если вам не нужны данные в режиме реального времени, вы можете выяснить это из лог-файлов. Это удобно, если вы пытаетесь выяснить шаблоны трафика, но не так полезно в режиме реального времени.

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

  4. Установите файл cookie для внешнего перенаправления, а затем найдите его в следующем запросе. Это не поймает людей, которые не устанавливают файлы cookie.

  5. Добавьте информацию о пути к перенаправлению или, возможно, параметры запроса, как предложил Синан.

Ответ 3 · рейтинг 3 · Saša

Это то, что я недавно сделал, чтобы обнаружить перенаправление и представить его как настраиваемый заголовок запроса для приложения: X-Redirect: 1 (используя mod_rewrite и mod_headers Apache).

На стороне источника я перенаправляю все запросы на целевой сервер, добавляя дополнительный /redirect к пути URL:

RewriteRule ^/(.*) http://target-server.com/redirect/$1 [L,R=permanent]

На целевой стороне я обнаруживаю /redirect в пути, удаляю его с помощью другого перенаправления и вставляю в ответ собственный файл cookie:

RewriteRule ^/redirect/(.*)$ /$1 [R=permanent,L,CO=redirect:1:target-server.com:86400:/]

Также на целевой стороне я преобразовываю файл cookie в переменную среды, "отключаю" файл cookie, а затем преобразую переменную env в собственный заголовок запроса:

RewriteCond %{HTTP_COOKIE} redirect=1 [NC]
RewriteRule ^(.*)$ /$1 [L,CO=redirect:0:target-server.com:86400:/,E=redirect:1]
RequestHeader set X-Redirect 1 env=redirect

Ответ 4 · рейтинг 2 · Gumbo

Я не думаю, что есть способ сделать это. Единственный индикатор, который я могу себе представить, это Referer поле заголовка. Но похоже, что он отправляется только в том случае, если запрос был инициирован не через HTTP (щелчок по ссылке, отправка формы, метаобновление и т. д.).

Ответ 5 · рейтинг 1 · G Berdal

Вдохновленный Брайаном, я сделал шаг назад и посмотрел, что именно вызывает мою проблему.

На этот вопрос может не быть ответа, но есть решение, которое частично решает проблему. При использовании сеансовых файлов cookie измененный контент будет существовать только для этого конкретного сеанса, поэтому в следующий раз исходный контент снова станет доступным. Это не меняет того факта, что повторный ввод URL-адреса в адресной строке по-прежнему приведет к тому, что страница будет использовать файл cookie.

Спасибо всем за попытку помочь.

Ответ 6 · Daniel C. Sobral

Если запрос был перенаправлен, должен быть заголовок, указывающий, откуда он был перенаправлен.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы