方案: - 我在成功登录后将用户重定向到上一页。 login.php 有一个表单,其中包含用户名和密码以及POST到 login_check.php 。 login_check.php 检查用户的身份验证,如果通过,它会将用户重定向到默认页面,除非用户有选择(即:如果他访问了其他某个页面,请说 people.php 并且people.php发现他没有登录并将他重定向到登录页面,以便他可以在成功登录后返回)。我还将访问过的网址存储在 login.php 中表单中的隐藏字段中: -
echo '<input type="hidden" name="location" value="';
if(isset($_GET['location']))
{
echo htmlspecialchars($_GET['location']);
}
echo '"/>';
在 login_check.php 中,验证后检查我是否有用户选择,否则将其重定向到默认页面: -
//REDIRECT USER TO PREVIOUS PAGE IF ANY
if(isset($_POST['location']))
{
header("location:".$_POST['location']);
exit;
}
我的问题: - 如果我在浏览器中编写URI oples.php ,它会提示我相应登录并在登录后重定向我。如果我尝试类似的话 people&amp; lsquo; s.php 我找不到页面消息。(使用htmlspecialchars()的编码URL存储在隐藏字段中,如上面的代码所示)。那么,URL的解码在哪里发生?为什么它不起作用(即:people&amp; lsquo; s.php)?
答案 0 :(得分:0)
如果您在HTML文档中编写HTML实体(而不是在具有内部CDATA的元素内部,如<script>
),那么实体将在解析HTML并生成DOM时进行解码。
这是<input value=...
示例中发生的情况。
当提交表单时,当浏览器从表单中的输入构造URL时,实体已经被解码。
当您将HTML实体放入HTTP标头(例如location
)时,浏览器不会对其进行解码.HTTP标头不是HTML文档,因此不会被解析为HTML。
在您的示例中,实体已经被浏览器解码,然后被发送到服务器以填充$_POST
。
当您在浏览器的地址栏中放置HTML实体时,浏览器不会对其进行解码。 URL不是HTML文档,因此不会被解析为HTML。
答案 1 :(得分:-1)
我的观点是,您不应该使用需要编码的字符来命名文件。
在文件login_check.php中,您可以使用:
header("location:".htmlspecialchars_decode($_POST['location']));
将‘
解码回'