Проверка файлов cookie и перенаправление с помощью Apache

#php #mysql #apache #drupal #drupal-6

#php #mysql #apache #drupal #drupal-6

Вопрос:

Я хотел бы получить некоторые отзывы по этому поводу. Я не уверен, что это правильный подход.

Подробности

Я использую Apache 2 с PHP 5.3 / MySQL 4, а платформой является Drupal 6.

Я разрабатываю сайт, который содержит обзоры ресторанов в нескольких выбранных городах. Когда пользователи попадают на сайт, он может выбрать, какой город принадлежит им. Я сохраняю их выбор в cookie, и если они не сделали выбор, я выбрал город по умолчанию.

Предлагаемое решение

Теперь я хочу URL mydomain.com/reviews перенаправить на конкретный URL-адрес города на основе выбранного ими города. Например mydomain.com/reviews/paris если я выбрал Париж в качестве своего города. (Если файл cookie не установлен, он должен перенаправлять на город по умолчанию.)

Я считаю это лучшей альтернативой, потому что я хочу, чтобы пользователь мог видеть отзывы в другом городе, не меняя свой город. Если они хотят просмотреть отзывы о лондонском ресторане, они могут просто перейти на mydomain.com/reviews/london .

Для лучшей производительности я думаю о том, чтобы Apache проверял cookie и перенаправлял в нужный город, когда пользователь отправляется в mydomain.com/reviews .

Итак, вот мои вопросы…

  1. Как мне настроить Apache для этого?
  2. Это лучший способ?

Ответ №1:

  1. Чтобы настроить Apache для этого, используйте следующее, заменив на имя cookie.

     RewriteEngine on
    RewriteCond %{REQUEST_URI} ^/reviews/?$
    RewriteCond %{HTTP_COOKIE} <cookie>=([^;] )
    RewriteRule .* http://mydomain.com/reviews/%1 [R=302,L]
      
  2. Yelp сохраняет местоположение в cookie, поэтому я бы воспринял это как хороший знак, поскольку у них много трафика и, похоже, дела идут хорошо.

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

Комментарии:

1. Спасибо! Могу ли я установить cookie по умолчанию (скажем, «paris») в Apache, если у пользователя его нет?

2. Вы могли бы использовать Set-Cookie, который задокументирован здесь httpd.apache.org/docs/2.3/mod/mod_headers.html , но на вашем месте я бы сделал это в вашем коде.

3. Замена <cookie> именем файла cookie, значение которого вы хотели бы получить. Также меня сбила с толку обратная ссылка %1, которая работает только до последней секунды перезаписи, у меня было промежуточное правило, и я не мог заставить его работать правильно.

Ответ №2:

Существует также способ присвоить пользовательское значение по умолчанию, если файл cookie не установлен непосредственно в правилах перезаписи!

%1 всегда относится к последнему RewriteCond вычисленному! Если файл cookie найден, второй RewriteCond игнорируется. Если ничего не найдено, выполняется оценка второго. Все, что он делает, это присваивает значение, а затем сопоставляет это значение целиком!

 RewriteEngine on
RewriteCond %{HTTP_COOKIE} cookiename=([^;] ) [OR]
RewriteCond defaultvalue (.*)
RewriteRule ^(.*)$ /mypath/%1 [L,R=302]
  

Вы можете добавить другие RewriteCond проверки, но это должны быть последние две строки перед финальным RewriteRule