Pim*_*ger 9 php apache .htaccess session
是否可以读取Apache中.htaccess文件中的php $ _SESSION数组中的数据?所以说我有以下内容:
$_SESSION['foo'] = 'bar';
Run Code Online (Sandbox Code Playgroud)
我可以在.htaccess做类似的事情:
RewriteRule bla.png folder/{the php session var foo}/file.png
Run Code Online (Sandbox Code Playgroud)
那可能吗?
我已经有了一个可行的解决方法,但如果可行的话,它会更好.
jav*_*web 10
不,至少不像你想象的那样.调用该文件是.htaccess因为它们是"分布式配置文件",当然配置&& 访问处理必须首先发生 - 因此,您无法获得"PHP会话变量",因为它只是在处理之后才会出现.htaccess
我将在下面向您展示一些解决方法,但在此之前 - 您应该注意这一点:
如果你只想重新定位文件路径/由登录用户 - .htaccess不是方式 - 使用bla.php地址然后在PHP文件中做重定向 - 这样的事情:
<?php
session_start();
header("Location: folder/".$_SESSION['foo']."/file.png");
exit();
?>
Run Code Online (Sandbox Code Playgroud)
但是,如果您无法更改源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文件中执行此操作,这里有一些解决方法
在现代,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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,技巧是HTTP_COOKIE为某些条件创建条件检查服务器变量.它基本上说:
是否有名为"foo"的COOKIE仅包含" - ,_,小写或大写字母或数字"?
如果是这样 - 重定向example.com/bla.png到example.com/folder/CURRENT_FOO_VALUE/file.png
[flags]:307重定向(R = 307),不介意字母大小写(NC),不要申请其他规则(L)
好的一点是HTTP_COOKIE服务器变量的结构是这样的:
name=value; name2=value2
Run Code Online (Sandbox Code Playgroud)
HTTP_SESSION使用mod_session 读取环境变量的会话有关如何将会话读入env的更多信息,请参阅mod_session的apache手册HTTP_SESSION.变量.那么方法将与"COOKIE-workaround"相同.
RewriteMap@Chris建议的指令读取它但是你会再次以某种方式检测出哪个'foo'可能SSL_SESSION_ID或其他一些$_GET/$_POST参数?