在 .htaccess 中获取 PHP 会话变量
Posted
技术标签:
【中文标题】在 .htaccess 中获取 PHP 会话变量【英文标题】:Get PHP session vars in .htaccess 【发布时间】:2010-09-25 10:40:04 【问题描述】:是否可以在 Apache 的 .htaccess 文件中读取 php $_SESSION 数组中的数据?所以说我有以下内容:
$_SESSION['foo'] = 'bar';
然后我可以在 .htaccess 中执行以下操作吗:
RewriteRule bla.png folder/the php session var foo/file.png
这可能吗?
我已经有一个可行的解决方法,但如果可以的话,那就更好了。
【问题讨论】:
【参考方案1】:回答主要问题:
不,至少不像你想象的那样。该文件名为.ht
access
,因为它们是“分布式配置文件”,当然还有配置&& 访问 处理必须首先发生 - 因此您无法获得“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
参数?
【讨论】:
【参考方案2】:我不知道这是可能的。
但我可以想到一些涉及重写 PHP 脚本的解决方法。
【讨论】:
对,改写成PHP脚本,让PHP输出PNG。【参考方案3】:我认为这不是你可以轻易做到的。您可以在 .htaccess 中使用 %HTTP_COOKIE 之类的内容来读取 PHPSESSID,但是为了访问会话中的实际数据,PHP 需要做很多额外的工作,因此您必须以某种方式重新实现它(即从存储的任何地方读取数据,反序列化等)
【讨论】:
这是正确的答案 - 如果你想在你的 htaccess 中使用会话数据,你必须先将它写入一个 cookie。【参考方案4】:我不确定这是否适用于您的特定问题,但 RewriteMap 是一个非常有用且经常被忽视的 mod_rewrite 指令。
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap
如果您可以预先计算会话变量或将它们存储到文本文件中(可能在设置它们时),则可以根据任何可用的请求详细信息轻松检索映射条目。
否则,您可以组合一个简单的外部映射器(可能是最简单的 PHP 脚本),它使用 sessionid 来确定会话变量的值并返回正确的 URL 以供重写规则使用。
【讨论】:
【参考方案5】:你不能按照你想要的方式去做。
如果您真的在使用 $_SESSION 变量,那么您可以使用一个 Apache 环境变量,它的值与 $_SESSION 变量的值相同。
查看以下列表,看看是否有帮助:http://www.zytrax.com/tech/web/env_var.htm
你必须像这样使用它:
重写规则 bla.png 文件夹/%VAR_NAME/file.png
【讨论】:
以上是关于在 .htaccess 中获取 PHP 会话变量的主要内容,如果未能解决你的问题,请参考以下文章