Ответ на главный вопрос:
Нет, по крайней мере, не так, как вы себе представляете. Файл называется .ht
access
, поскольку они "распределенные файлы конфигурации" и, конечно, конфигурация && доступ * Обработка 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
параметры?