是否可以读取Apache中.htaccess文件中php $ _SESSION数组中的数据?所以说我有以下内容:
$_SESSION['foo'] = 'bar';
然后我可以在.htaccess做类似的事情:
RewriteRule bla.png folder/{the php session var foo}/file.png
这可能吗?
我已经有了一个有效的解决方法,但如果可行,那就更好了。
答案 0 :(得分:10)
不,至少不像你想象的那样。该文件名为.ht
access
,因为它们是“分布式配置文件”,当然还有配置&& ;首先必须进行 访问 处理 - 因此,您无法获得“PHP会话变量”,因为它只是在处理.htaccess
我会在下面向您展示一些解决方法,但在此之前 - 您应该注意这一点:
如果您只是想要由登录用户重定向文件路径 / - .htaccess不是 - 只使用bla.php
作为地址,然后在php文件执行重定向 - 类似这样:
<?php
session_start();
header("Location: folder/".$_SESSION['foo']."/file.png");
exit();
?>
但是,如果您无法更改源网址,则必须首先将bla.png
重定向到bla.php
,但我想您知道该怎么做: - )
在使用MPV / MVC模型的框架中,出于某种原因通常会出现“路由”脚本 - 例如这个。
或者你可以从这个脚本中创建一个“php-router”,添加一些其他PHP依赖的重定向,同时使用if/elseif/else
或case
选择将要发生的事情 - 重定向将在哪里。 / p>
您可能正在使用会话 - 所以为什么不直接在PHP中生成网址,如:$url = "example.com/bla.png?foo=".$_SESSION['foo'];
+ .htaccess
中的regexp甚至:
$url = "example.com/folder/".$_SESSION['foo']."/file.png";
无论如何,我猜你是重定向的,因为你不能(出于某种原因)这样做。 : - )
如果你仍然被说服你必须在.htaccess文件中执行此操作,这里有一些解决方法
在现代,Cookie通常是可用的,因此如果您“信任”您的客户的Cookie,您可以根据HTTP_COOKIE
服务器变量制定重定向规则 - 假设您存储了名为“{{1}的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
服务器变量。它基本上说:
是否有名为“foo”的COOKIE仅包含“ - ,_,小写或大写字母或数字”?
如果是这样 - 将 example.com/bla.png 重定向到 example.com/folder/CURRENT_FOO_VALUE/file.png
[flags] :307 redirect(R = 307),不介意字母(NC),不适用其他规则(L)
好的一点是HTTP_COOKIE
服务器变量的结构是这样的:
HTTP_COOKIE
name=value; name2=value2
环境变量的会话
有关如何将会话读入HTTP_SESSION
env的更多信息,请参阅apache manual for mod_session。变量。那么方法将与“COOKIE-workaround”相同。
HTTP_SESSION
指令将其读取为@Chris建议但是你又会以某种方式检测出哪个'foo'可能是RewriteMap
或其他SSL_SESSION_ID
个参数?
答案 1 :(得分:7)
我不知道它可能。
但我可以想到一些涉及重写PHP脚本的变通方法。
答案 2 :(得分:2)
我不认为这是你可以轻易做到的事情。您可以在.htaccess中使用类似%{HTTP_COOKIE}的内容来读取PHPSESSID,但为了能够访问会话中的实际数据,PHP正在做很多额外的工作,因此您必须以某种方式重新实现(即从存储的任何地方读取数据,反序列化等。)
答案 3 :(得分:1)
我不确定这是否适用于您的特定问题,但RewriteMap对于mod_rewrite来说是一个非常有用且经常被忽视的指令。
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap
如果您可以预先计算会话变量或将它们存储到文本文件中(可能在设置时),则可以根据任何可用的请求详细信息轻松检索地图条目。
否则,您可以组合一个简单的外部映射器(可能是最简单的PHP脚本),它使用sessionid来确定会话变量的值,并返回要使用的重写规则的正确URL。
答案 4 :(得分:-3)
你不能按照你想要的方式去做。
如果你真的在使用$ _SESSION变量,那么你可以使用的Apache环境变量与$ _SESSION变量具有相同的值。
查看以下列表,看看是否有任何帮助:
http://www.zytrax.com/tech/web/env_var.htm
你必须像这样使用它:
RewriteRule bla.png 文件夹/%{VAR_NAME} /file.png