【问题标题】:Get PHP session vars in .htaccess在 .htaccess 中获取 PHP 会话变量
【发布时间】: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

这可能吗?

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

【问题讨论】:

    标签: php apache session .htaccess


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          • 2015-12-18
          • 2013-01-03
          • 1970-01-01
          • 2012-08-05
          相关资源
          最近更新 更多