是否有可能在.htaccess和php之间共享信息?

时间:2016-10-16 22:33:54

标签: php .htaccess mod-rewrite

您好,

可以在PHP脚本和.htaccess之间共享信息吗? 我正在试验$ _ENV,但没有让它发挥作用。

我想做什么:

创建登录系统。对于每个html请求,.htaccess调用(通过重写规则)一个php并将原始url作为参数传递.PHP正在测试用户是否登录。如果不是:转到登录页面,如果是:允许访问请求的URL。我用php“header($ url)”。

问题:这总是启动一个循环,因为PHP脚本在登录测试成功后,请求原始URL,通过调用PHP脚本再次在.htaccess中处理。

我的想法:有没有办法在PHP中设置一个变量,我可以在.htaccess-condition中访问它?这是一种安全的方式吗?

更新

按照要求,这里是我的代码。

PHP:

session_start();
$sOriginUrl = $_GET["url"];

if(!$sOriginUrl){
    return false;
}

if($_SESSION["userName"]) {
    if($_SESSION["userName"] !== null){
    header("Location: " . $sOriginUrl, TRUE, 301);
}
else {
    $aTokenizedOriginalUrl = explode("/", $sOriginUrl);
    $sLoginUrl = "/";
    for($i=0, $il=count($aTokenizedOriginalUrl); $i<($il-1); $i++) {
        $sLoginUrl = $sLoginUrl . $aTokenizedOriginalUrl[$i] . "/";
    }
    header("Location: //myurl.de/" . $sLoginUrl);
}
}
else {
    $aTokenizedOriginalUrl = explode("/", $sOriginUrl);
    $sLoginUrl = "/";
    for($i=0, $il=count($aTokenizedOriginalUrl); $i<($il-1); $i++) {
        $sLoginUrl = $sLoginUrl . $aTokenizedOriginalUrl[$i] . "/";
    }
    $_ENV["HTTP_user_logged"]="true";
    header("Location: //myurl.de/" . $sLoginUrl);
}

htaccess的:

RewriteEngine on

# This prevents the rewrite engine from looping
RewriteCond %{ENV:HTTP_user_logged} true
#RewriteCond %{forced_responsecode} 301
RewriteRule ^ - [L]

#RewriteCond %{ENV:REDIRECT_STATUS} !=""
RewriteCond %{HTTP_REFERER} !^/myurl.de/basics/validate-user-login-for-url.php$
RewriteCond %{REQUEST_URI} !^(/.*)/$
RewriteCond %{REQUEST_URI} !^(/.*)/index.html$
RewriteRule ^(.*\.html)$ /myurl.de/basics/validate-user-login-for-url.php?url=%{REQUEST_URI}&ref=%{HTTP_REFERER} [L,QSA]

感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

我担心你所要求的是可能。 PHP无法与.htaccess共享信息,因为在执行PHP之前检查后者,因此工作流程为“req - &gt; .htaccess - &gt; php; req - &gt; .htaccess - &gt; php “,但请求之间唯一保留的是cookie,并且不保证在cookie中保存登录状态是不安全的,你需要使用会话,并且.htaccess中没有PHP会话

所以我建议的解决方案是项目中需要用户进行身份验证的每个文件在开头都包含一个文件“check_auth.php”,然后check_auth.php可以包含()登录页面和exit()if没有登录,或者只是在用户登录时什么也不做(这意味着最初调用的脚本继续执行。

希望这会有所帮助。干杯