如何解决如何防止直接访问php页面但重定向时可以访问
我想阻止直接访问我的错误页面 Flutter config --android-sdk "C:\Users\UserName\AppData\Local\Android\Sdk"
,但我希望从其他页面重定向时可以访问此页面。
就像我的网站名称是 404.PHP
一样,如果任何用户以任何方式输入错误,例如 example.com/index.PHP
,它将被重定向到我的 example.com/ind.PHP
以在我的 404.PHP
文件中执行此操作用过。
另外,假设在我的 .htaccess
文件中,当我点击任何产品时,我正在显示一些产品,它会将我带到 index.PHP
,其中 product.PHP?pid=4
包含 pid
,现在我设置了一个条件,如果 id
或它不存在,则将其重定向到 id!=4
。
到此为止的一切都很好,但是如果我访问 404.PHP
,它会向我显示页面,我只希望用户何时直接使用 example.com/404.PHP
它将重定向到 example.com/404.PHP
文件。就是这样。
index.PHP
索引.PHP
# enable url rewriting
RewriteEngine On
ErrorDocument 404 http://localhost/news_21_off/404.PHP
Products.PHP
$sql = "select * from products";
$res = MysqLi_query($co,$sql);
$rs = MysqLi_fetch_assoc($res);
$res_id = $rs['id'];
<a href="products.PHP?pid=<?PHP echo $res_id; ?>">Product</a>
404.PHP
if(isset($_GET['pid']) && $_GET['pid']=='4'){
echo 'correct';
}else{
header('location:404.PHP');
}
到目前为止,我还没有找到办法。
解决方法
到此为止一切都很好...
其实我觉得不是...
...阻止直接访问 php 页面,但可以在重定向时访问
这不仅仅是任何 PHP 页面。这是您的 404“未找到”错误文档。
首先,您不应该从外部 3xx 重定向到您的错误文档。错误文档应在相同请求(“内部子请求”)中提供。这是您问题的根本原因。
重定向的请求是一个完全独立的请求,与“直接请求”几乎没有区别,这自然会“不可能”可靠地阻止直接请求。但是,您真的需要阻止对 404 错误文档的“直接请求”吗? (见下文...)
ErrorDocument 404 http://localhost/news_21_off/404.php
通过在 ErrorDocument
指令中指定绝对 URL(即使用方案 + 主机名),Apache 将触发 302 外部重定向到指定的 URL。用户看到 302 响应(不是 404),然后是来自重定向请求的 200“OK”(不是 404),除非您在 PHP 代码中手动发送 404“未找到”状态(没有证据表明那个)。
仅仅因为 Apache 允许您“重定向”到错误文档,并不意味着您应该这样做。如 Apache docs 中所述:
请注意,当您指定一个指向远程 URL 的 ErrorDocument
时(即前面带有 http 等方法的任何内容),Apache HTTP Server 将向客户端发送重定向以告诉它在哪里查找文档,即使该文档最终位于同一台服务器上。 这有几个含义,最重要的是客户端不会收到原始错误状态代码,而是会收到重定向状态代码。这反过来会混淆网络漫游器和其他客户端,这些客户端尝试使用状态代码确定 URL 是否有效。
此外,通常与触发 404 的 URL 相关的所有有用的 PHP 超全局变量(从 Apache 传递)都丢失了(例如,$_SERVER['REDIRECT_STATUS']
、$_SERVER['REDIRECT_URL']
等),因为如上所述上面,重定向的请求是一个完全独立的请求。
99.99% 的情况下,您应该在 ErrorDocument
指令中使用相对于根目录的 URL 路径,以便 Apache 触发针对错误文档的内部子请求,例如:
ErrorDocument 404 /news_21_off/404.php
header('location:404.php');
同样,您也不应该在 PHP 代码中“重定向”到您的错误文档。
在 PHP 中,有多种方法可以解决此问题。您可以简单地include()
在您希望提供 404 的代码点处的错误文档。
例如,在您的 products.php
脚本中:
<?php
$pid = $_GET['pid'] ?? null;
if ($pid == '4') {
echo 'correct';
} else {
// 404 Not Found
include($_SERVER['DOCUMENT_ROOT'].'/news_21_off/404.php');
exit();
}
但是,以上不会向客户端发送 404 HTTP 状态代码。在您的 PHP 404 错误文档中,您应该设置 HTTP 状态以确保 404 状态由 PHP 发送,以及何时/如果用户直接访问该文档。
例如,在您的 404.php
脚本中:
<?php
http_response_code(404);
?>
<h1>My 404 page</h1>
顺便说一句,在 PHP 脚本中设置 HTTP 状态代码将覆盖 Apache 在提供错误文档时可能设置的任何状态。
现在,回到你最初的问题......
我想阻止直接访问我的错误页面,即 404.php
为什么?
实施上述更改后,如果用户“直接访问”您的 404 错误文档,他们只会收到 404 并看到相同的响应,就好像他们请求任何其他不存在的文档一样。
因此,除非您有特定要求,否则您无需在此处执行任何操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。