如何防止直接访问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 并看到相同的响应,就好像他们请求任何其他不存在的文档一样。

因此,除非您有特定要求,否则您无需在此处执行任何操作。