回答主要问题:
不,至少不像你想象的那样。该文件名为.htaccess,因为它们是“分布式配置文件”,当然还有配置&& 访问 处理必须首先发生 - 因此您无法获得“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 选择将要发生的事情 - 重定向的去向。
或
您可能正在使用会话 - 那么为什么不直接在 PHP 中生成 url,例如:
$url = "example.com/bla.png?foo=".$_SESSION['foo']; + regexp in .htaccess 甚至:
$url = "example.com/folder/".$_SESSION['foo']."/file.png";
无论如何,我猜你正在重定向,因为你不能(出于某种原因)这样做。 :-)
解决方法
如果您仍然认为必须在 .htaccess 文件中执行此操作,这里有一些解决方法
1) 使用 cookie
在现代,cookie 经常可用,因此如果您“信任”客户端的 cookie,则可以基于 HTTP_COOKIE 服务器变量制定重定向规则 - 假设您之前存储了名为“foo”的 cookie :
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 server-variable。它基本上说:
是否有一个名为“foo”的 COOKIE 只包含“-、_、小写或大写字母或数字”?
如果是这样 - 将 example.com/bla.png 重定向到 example.com/folder/CURRENT_FOO_VALUE/file.png
[flags]:307 redirect (R=307),不要介意字母大小写 (NC),不要应用其他规则 (L)
好的一点是HTTP_COOKIE server-variable 的结构是这样的:
name=value; name2=value2
2) 不推荐 - 其他解决方法:
a) 使用 mod_session 将会话读取到 HTTP_SESSION 环境变量
有关如何将会话读入HTTP_SESSION 环境的更多信息,请参阅apache manual for mod_session。多变的。该方法将与“COOKIE-workaround”相同。
b) 将所需信息存储在文本文件中,并按照 @Chris 的建议使用 RewriteMap 指令读取它
但你还是必须以某种方式检测它是哪个“foo”,所以可能是 SSL_SESSION_ID 或其他一些 $_GET/$_POST 参数?