gpt4 book ai didi

php - 是否可以通过 PHP 访问 REQUEST_FILENAME?

转载 作者:行者123 更新时间:2023-12-05 01:09:19 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Apache rewrite - get original URL in PHP

(3 个回答)


8年前关闭。




我试图更详细地了解以下 htaccess 规则:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]
</IfModule>

具体来说,我试图了解 REQUEST_FILENAME 的工作原理。我发现有几个资源讨论了这个问题,从 mod_rewrite 文档到 Stack Overflow 上的答案。但是似乎没有人解决我正在寻找的问题,我该如何仔细查看 REQUEST_FILENAME 变量以查看它的值?

通常,当我想查看 .htaccess 中引用的变量时,我将使用 print_r 来查看 $_SERVER 全局以查看这些值是什么服务器:
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
die('fin');

这可以帮助我查看上面的 $_SERVER['REQUEST_URI'] 等值。但是在我当前环境中的任何 PHP $GLOBALS 中似乎都没有 REQUEST_FILENAME 。我确实看到了 SCRIPT_FILENAME 的值,并且有几个消息来源说这两个值相等,但不清楚它们是否是替代品,或者如果第一个不存在,REQUEST_FILENAME 是否回退到 SCRIPT_FILENAME。

通过稍微更新 htaccess 规则以输出 URL 中的值,我已经能够输出 REQUEST_FILENAME 值,将最后一行更改为:
RewriteRule (.+) index.php?p=%{REQUEST_FILENAME} [R=302,QSA,L]

但是为什么这个值在 PHP 中的任何地方都不可用?有什么我忽略的东西可以帮助我了解这个变量的存储位置以及如何通过 PHP 查看它的值?

最佳答案

来自 RewriteCond

REQUEST_FILENAME
The full local filesystem path to the file or script matching the request, if this has already been determined by the server at the time REQUEST_FILENAME is referenced. Otherwise, such as when used in virtual host context, the same value as REQUEST_URI. Depending on the value of AcceptPathInfo, the server may have only used some leading components of the REQUEST_URI to map the request to a file.



来自 $_SERVER

'SCRIPT_FILENAME'
The absolute pathname of the currently executing script.



这将是相同的(脚本的完整路径),如果 REQUEST_URI实际上对应于现有文件。

如果没有, REQUEST_FILENAME将只是 REQUEST_URISCRIPT_FILENAME将是执行的 PHP 脚本的名称。 $_SERVER['REQUEST_URI']将是 REQUEST_FILENAME (又名 REQUEST_URI)。

在您的情况下, SCRIPT_FILENAME将永远是 /path/to/index.phpREQUEST_FILENAME/ REQUEST_URI可通过 $_SERVER['REQUEST_URI'] 访问.

更新 :
REQUEST_URI永远不会是文件名,因为它缺少文档根前缀。当你使用
RewriteCond %{REQUEST_URI} !-f

条件将始终为真,即使请求的 URL 与现有文件匹配。以下 RewriteRule将始终执行,尽管它应该调用另一个 PHP 脚本或提供 HTML、CSS 或图像文件。

更新 :

要实际回答问题。

But why isn't this value available anywhere in PHP?


REQUEST_FILENAME在 PHP 中不可用,因为它不在环境或请求的 header 中。

您在 PHP 中所能看到的,要么是某个环境变量,要么是在头文件中,或者是 PHP 可以推断出的东西。由于 PHP 不会尝试或无法在请求 URI 和某个文件名之间建立连接,因此您无法在任何地方访问它。 REQUEST_FILENAME毕竟可能在文件系统中的任何地方。

但是,您可以自己将其放入环境中
RewriteRule (.+) index.php?p=$1 [QSA,L,E=REQUEST_FILENAME:%{REQUEST_FILENAME}]

并在 PHP 中作为 $_SERVER['REDIRECT_REQUEST_FILENAME'] 访问它.

关于php - 是否可以通过 PHP 访问 REQUEST_FILENAME?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15933225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com