代码之家  ›  专栏  ›  技术社区  ›  Pim Jager

在.htaccess中获取PHP会话变量

  •  12
  • Pim Jager  · 技术社区  · 17 年前

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

    $_SESSION['foo'] = 'bar';
    

    那么,我可以在.htaccess中执行以下操作吗:

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

    有可能吗?

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

    5 回复  |  直到 14 年前
        1
  •  12
  •   jave.web    12 年前

    主要问题的答案:

    不, 至少不像你想象的那样。文件名为 .ht access 因为他们是 “分布式配置文件” 当然还有配置和;& 通道 必须首先进行处理,因此您无法获得“PHP会话变量”,因为它只是在处理完 .htaccess

    我将在下面向您展示一些解决方法,但在此之前,您应该 请注意:

    这真的有必要吗?-建议的解决方案:

    如果你只是想重定向文件路径 / 由登录用户- .htaccess不是正确的方式 -使用just bla.php 作为地址,然后在php文件中执行重定向,如下所示:

    <?php
       session_start();
       header("Location: folder/".$_SESSION['foo']."/file.png");
       exit();
    ?>
    

    但是,如果您无法更改源URL,则必须首先重定向 bla.png bla.php 但我想你知道怎么做:-)

    在使用MPV/MVC模型的框架中,经常有用于“路由”的脚本,这是有原因的,例如这个。
    您可以选择使用此脚本制作一个“php路由器”,在使用时添加一些其他依赖php的重定向 if/elseif/else case 选择将发生什么-重定向将去哪里。

    不管怎样,你可能正在使用一个会话——那么为什么不直接在PHP中生成url呢,比如:
    $url = "example.com/bla.png?foo=".$_SESSION['foo']; +正则表达式 .htaccess 或者甚至:
    $url = "example.com/folder/".$_SESSION['foo']."/file.png";
    不管怎样,我想你重定向是因为你不能(出于某种原因)这样做。 :-)

    权变措施

    如果你仍然相信你必须在.htaccess文件中这样做,这里有一些解决方法

    1) 使用Cookie

    在现代,Cookie经常可用,因此如果您“信任”客户的Cookie,您可以根据以下内容制定重定向规则 HTTP_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
    

    正如你所看到的,诀窍是创建条件检查 HTTP_COOKIE 服务器变量用于某些条件。它基本上说:

    是否有一个名为“foo”的COOKIE只包含“-、_、小写或大写字母或数字”?
    如果是-重定向 example.com/bla.png example.com/folder/CURRENT_FOO_VALUE/file.png

    [旗帜] : 307 redirect (R=307),不介意字母大小写(NC),不适用其他规则(L)

    好的一点是 HTTP_COOKIE 服务器变量的结构如下:

    name=value; name2=value2
    

    2) 不建议-其他解决方法:

    a) 阅读会话 HTTP_SESSION 使用mod_session的环境变量

    请参阅 apache manual for mod_session 有关如何将会话读入的更多信息,请参阅 HTTP_SESSION 环境。变量。然后,该方法将与“COOKIE变通方法”相同。

    b) 将所需信息存储在文本文件中,并使用 RewriteMap 正如@Chris所建议的那样

    但是,你必须以某种方式检测它是哪个“foo”,所以也许 SSL_SESSION_ID 或其他 $_GET/$_POST 参数?

        2
  •  8
  •   benlumley    17 年前

    我不知道这是可能的。

    但我能想到一些涉及重写PHP脚本的解决方法。

        3
  •  2
  •   Tom Haigh    17 年前

    我认为这不是你能轻易做到的。您可以在.htaccess中使用类似%{HTTP_COOKIE}的内容读取PHPSESSID,但为了访问会话中的实际数据,PHP会做很多额外的工作,因此您必须以某种方式重新实现(即从存储数据的任何地方读取数据,反序列化等)

        4
  •  1
  •   Chris    17 年前

    我不确定这是否适用于您的特定问题,但RewriteMap是一个非常有用且经常被忽视的mod_rewrite指令。

    http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap

    如果您可以预先计算会话变量或将其存储到文本文件中(可能是在设置时),则可以根据任何可用的请求详细信息轻松检索映射条目。

    否则,您可以组合一个简单的外部映射器(可能是最简单的PHP脚本),它使用sessionid来确定会话变量的值,并返回重写规则要使用的正确URL。

        5
  •  -2
  •   rfgamaral    17 年前

    你不能按照你想要的方式去做。

    如果你真的在使用$_SESSION变量,也许你可以使用一个Apache环境变量,它的值与$_SESSING的值相同。

    查看以下列表,看看其中是否有任何帮助:
    http://www.zytrax.com/tech/web/env_var.htm

    你必须这样使用它:

    重写规则bla.png 文件夹/%{VAR_NAME}/file.png