【问题标题】:Is it possible to share informations between .htaccess and php?是否可以在 .htaccess 和 php 之间共享信息?
【发布时间】:2016-10-16 22:33:54
【问题描述】:

嗨,

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

我想做什么:

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

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

我的想法:有没有办法在 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]

感谢您的帮助!!

【问题讨论】:

  • 发布您的代码。我猜这是您的 PHP 中的逻辑错误,而不是 htaccess 问题。您永远不需要在两者之间“共享”

标签: php .htaccess mod-rewrite


【解决方案1】:

恐怕你要问的是不可能。 PHP 无法与 .htaccess 共享信息,因为后者在 before PHP 执行之前被检查,所以工作流程是“req ->.htaccess -> php; req -> .htaccess -> php”,但是请求之间唯一保留的是cookie,不,将登录状态保存在cookie中是不安全的,您需要使用会话,并且PHP会话在.htaccess中不可用

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

希望这会有所帮助。干杯

【讨论】:

  • 好的。是的,据我所知,您的回答确实很有帮助,我解决问题的方法毫无意义,我不需要为此浪费时间:) 感谢您提出解决方案!不幸的是,它对我不起作用,因为我需要检查 .html 文件或其他东西,但从来没有一个 .php 文件,我只能在其中包含 testing-php。您还有其他想法或参考吗?谢谢!
  • 恐怕我没有太多其他东西了,请查看this 了解我提到的基于 cookie 的解决方案,但请记住 它不安全(就像你不能逐个用户控制访问)。也许对你来说已经足够了。
  • 是的,谢谢,但它真的不保存所以我不能使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2015-11-28
  • 2016-07-22
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多