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

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

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

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

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

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

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

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


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


Ответы (6)


Как насчет:

my $cgi = CGI->new;

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

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

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

person Sinan Ünür    schedule 24.07.2009
comment
Конечно, если они могут обновить все запросы, чтобы включить известную строку запроса, это поможет, но, как вы указываете, если пользователь добавляет в закладки этот URL-адрес или, что еще хуже, ссылается на него, вам нужно будет проверить что-то еще (например, информацию о реферере - и проверять содержимое не просто на то, что оно существует) - person Zhaph - Ben Duguid; 24.07.2009
comment
@Zhaph: идея состоит в том, чтобы перехватить запрос и преобразовать его. Даже если они попытаются получить старый URL-адрес, они все равно будут перенаправлены с дополнительной информацией. Если вы ищете части приложения, которые ссылаются на этот URL, может помочь анализ файла журнала и что-то вроде grep. :) - person brian d foy; 24.07.2009

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

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

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

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

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

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

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

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

person brian d foy    schedule 24.07.2009
comment
Спасибо за все ваши предложения, но ни одно из них не работает в этом случае. Все редиректы являются постоянными 301 редиректами и не могут быть ничем иным по причинам SEO. Данные нужны в режиме реального времени. Внутреннее перенаправление, похоже, не имеет значения в пункте назначения или, по крайней мере, не касается заголовков. Проблема с куки - это именно то, что вы упомянули. Параметры не разрешены из-за методов индексации Google. - person G Berdal; 24.07.2009
comment
В основном я думал об этом как о внутренних вещах, использующих преобразование URL-адресов, которые внешний мир никогда не увидит. - person brian d foy; 24.07.2009

Это то, что я недавно сделал, чтобы обнаружить перенаправление и представить его как настраиваемый заголовок запроса для приложения: 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
person Saša    schedule 22.08.2013

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

person Gumbo    schedule 24.07.2009
comment
Что ж, докажите мне обратное, мистер Голос против. - person Gumbo; 24.07.2009
comment
Я имею в виду, кажется, вы правы в том, что не получаете реферера в случае перенаправления. - person G Berdal; 24.07.2009

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

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

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

person G Berdal    schedule 25.07.2009

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

person Daniel C. Sobral    schedule 24.07.2009
comment
Я тоже так думал. Но я, кажется, не нахожу способа добраться до него. HTTP_REFERER в этом случае не отображается. - person G Berdal; 24.07.2009
comment
Должен — это сильно сказано. Спецификация HTTP не говорит, что следует. Заголовок может быть, но это не требование и даже не рекомендация. - person brian d foy; 24.07.2009