在.htaccess中获取PHP会话变量

时间:2008-12-05 00:15:45

标签: php apache session .htaccess

是否可以读取Apache中.htaccess文件中php $ _SESSION数组中的数据?所以说我有以下内容:

$_SESSION['foo'] = 'bar';
然后我可以在.htaccess做类似的事情:

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

这可能吗?

我已经有了一个有效的解决方法,但如果可行,那就更好了。

5 个答案:

答案 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/elsecase选择将要发生的事情 - 重定向将在哪里。 / p>

OR

您可能正在使用会话 - 所以为什么不直接在PHP中生成网址,如:$url = "example.com/bla.png?foo=".$_SESSION['foo']; + .htaccess中的regexp甚至:
$url = "example.com/folder/".$_SESSION['foo']."/file.png";
无论如何,我猜你是重定向的,因为你不能(出于某种原因)这样做。 : - )

的变通方法

如果你仍然被说服你必须在.htaccess文件中执行此操作,这里有一些解决方法

1)使用cookies

在现代,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

2)不推荐 - 其他解决方法:

a)使用mod_session

读取name=value; name2=value2 环境变量的会话

有关如何将会话读入HTTP_SESSION env的更多信息,请参阅apache manual for mod_session。变量。那么方法将与“COOKIE-workaround”相同。

b)将所需信息存储在文本文件中,并使用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