在 .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】:

回答主要问题:

不,至少不像你想象的那样。该文件名为.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/elsecase 选择将要发生的事情 - 重定向的去向。

您可能正在使用会话 - 那么为什么不直接在 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 会话变量的主要内容,如果未能解决你的问题,请参考以下文章

通过 .htaccess 在 PHP 中延长会话超时

使用 htaccess 在 URL 中获取两个变量

会话变量影响 PHP 中其他会话变量的问题

.htaccess 获取整个查询字符串到一个变量

如何使用 Ajax 函数从 php 服务器获取会话变量? (PHP HTML JS Ajax)

如何在同一台服务器上跨多个域维护 PHP 会话?