Получите переменные сессии PHP в .htaccess - PullRequest
9 голосов
/ 05 декабря 2008

Можно ли прочитать данные из массива php $ _SESSION в файле .htaccess в Apache? Скажем, у меня есть следующее:

$_SESSION['foo'] = 'bar';

Могу ли я тогда в .htaccess сделать что-то вроде:

RewriteRule bla.png folder/{the php session var foo}/file.png

Возможно ли это?

У меня уже есть рабочий обходной путь, но если это возможно, это будет намного лучше.

Ответы [ 5 ]

10 голосов
/ 13 августа 2014

Ответ на главный вопрос:

Нет, по крайней мере, не так, как вы себе представляете. Файл называется .htaccess, поскольку они "распределенные файлы конфигурации" и, конечно, конфигурация && доступ * Обработка 1016 * должна произойти первой - поэтому вы не можете получить «переменную сеанса PHP», потому что она просто приходит после обработки .htaccess

Я покажу вам некоторые обходные пути ниже, но прежде - вы должны обратить внимание на это:

Это действительно необходимо? - предлагаемые решения:

Если вы просто хотите перенаправить путь к файлу / вошедшим в систему пользователем - .htaccess НЕ является способом - используйте просто bla.php в качестве адреса, а затем в файле php выполните редирект - примерно так:

<?php
   session_start();
   header("Location: folder/".$_SESSION['foo']."/file.png");
   exit();
?>

Однако, если вы не можете изменить исходный URL, сначала вам нужно будет перенаправить bla.png на bla.php, но я думаю, вы знаете, как это сделать: -)

В средах, использующих модель MPV / MVC, часто есть сценарии для «маршрутизации» по какой-либо причине - например, этот.
При желании вы можете сделать «php-router» из этого скрипта, добавив некоторые другие перенаправления с поддержкой PHP, используя if/elseif/else или case, чтобы выбрать, что произойдет - куда пойдет перенаправление.

OR

Вы, вероятно, в любом случае используете сеанс - так почему бы просто не генерировать URL прямо в PHP, например:
$url = "example.com/bla.png?foo=".$_SESSION['foo']; + regexp в .htaccess или даже:
$url = "example.com/folder/".$_SESSION['foo']."/file.png";
В любом случае, я думаю, вы перенаправляете, потому что вы не можете (по какой-то причине) сделать это. : -)

Обходные

Если вас все еще убеждают, что вы должны сделать это в файле .htaccess, вот некоторые обходные пути

1) Использовать куки

В наши дни cookie-файлы часто доступны, поэтому, если вы «доверяете» cookie-файлам вашего клиента, вы можете создать правило перенаправления на основе HTTP_COOKIE серверной переменной - при условии, что вы сохранили cookie-файл с именем «foo» до этого. :

RewriteCond %{HTTP_COOKIE} ^(.*)foo=([-_a-zA-Z0-9]+)(.*)$ [NC]        
RewriteRule ^bla.png$ /folder/%2/file.png [R=307,NC,L] 
#possibly use 302 if you like dinosaurs

Как видите, хитрость заключается в создании условия проверки HTTP_COOKIE серверной переменной для некоторого условия. В основном это говорит:

Есть ли COOKIE с именем "foo", который содержит только "-, _, строчные или прописные буквы или цифры"?
Если это так - перенаправить example.com / bla.png в example.com / folder / CURRENT_FOO_VALUE / file.png

[флаги] : * перенаправление 307 (R = 307), не обращайте внимания на регистр букв (NC), не применяйте другие правила (L)

Хорошо, что HTTP_COOKIE переменная сервера структурирована следующим образом:

name=value; name2=value2

2) НЕ рекомендуется - другие обходные пути:

a) чтение сеанса в HTTP_SESSION переменную среды с использованием mod_session

См. Руководство по apache для mod_session для получения дополнительной информации о том, как читать сессию в HTTP_SESSION env. переменная. Тогда подход будет таким же, как и для «обходного пути COOKIE».

b) сохранить необходимую информацию в текстовом файле и прочитать ее с помощью директивы RewriteMap, как подсказал @Chris

Но, опять же, вам придется каким-то образом определять, что это за foo, так что, возможно, SSL_SESSION_ID или какие-то другие $_GET/$_POST параметры?

7 голосов
/ 05 декабря 2008

Я не знаю, что это возможно.

Но я могу вспомнить несколько обходных путей, связанных с переписыванием PHP-скрипта.

2 голосов
/ 05 декабря 2008

Я не думаю, что это то, что вы могли бы сделать легко. Вы можете прочитать PHPSESSID, используя что-то вроде% {HTTP_COOKIE} в вашем .htaccess, но для того, чтобы получить доступ к актуальным данным в сеансе, PHP проделывает много дополнительной работы, так что вам придется как-то повторно реализовать это ( т. е. чтение данных из любого места, десериализация и т. д.)

1 голос
/ 03 января 2009

Я не уверен, применимо ли это к вашей конкретной проблеме или нет, но RewriteMap - очень полезная и часто пропускаемая директива для mod_rewrite.

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap

Если вы можете предварительно вычислить переменные сеанса или сохранить их в текстовом файле (возможно, когда они будут установлены), записи карты могут быть легко получены на основе любой из доступных деталей запроса.

В противном случае вы могли бы собрать простой внешний преобразователь (вероятно, PHP-скрипт, который был бы наиболее простым), который использует sessionid для определения значения переменной сеанса и возвращает правильный URL-адрес для использования правилом перезаписи.

0 голосов
/ 05 декабря 2008

Вы не можете делать это так, как хотите.

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

Посмотрите на следующий список и посмотрите, поможет ли какой-либо из них:
http://www.zytrax.com/tech/web/env_var.htm

Вам придется использовать это так:

RewriteRule bla.png Папка /% {var_name} /file.png

...