加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

是否可以通过PHP访问REQUEST_FILENAME?

发布时间:2020-12-13 17:23:50 所属栏目:PHP教程 来源:网络整理
导读:参见英文答案 Apache rewrite – get original URL in PHP????????????????????????????????????3个 我正在尝试更详细地了解以下htaccess规则: IfModule mod_rewrite.c RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENA
参见英文答案 > Apache rewrite – get original URL in PHP????????????????????????????????????3个
我正在尝试更详细地了解以下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 docs到Stack Overflow上的答案.但似乎没有人正在解决我正在寻找的问题,我如何仔细查看REQUEST_FILENAME变量才能看到它的价值?

通常,当我想查看.htaccess中引用的变量时,我将使用print_r查看$_SERVER全局,以查看这些值的服务器内容:

echo "<pre>";
print_r($_SERVER);
echo "</pre>";
die('fin');

这可以帮助我看到上面的$_SERVER [‘REQUEST_URI’]等值.但似乎REQUEST_FILENAME在我当前环境中的任何PHP $GLOBALS中都不可用.我确实看到SCRIPT_FILENAME的值,有几个消息来源说这两个值是相等的,但是如果它们是替换的,或者如果第一个不存在则REQUEST_FILENAME回退到SCRIPT_FILENAME,则不清楚.

我已经能够通过略微更新htaccess规则来输出REQUEST_FILENAME值,以输出URL中的值,将最后一行更改为:

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_URI,SCRIPT_FILENAME将是执行的PHP脚本的名称. $_SERVER [‘REQUEST_URI’]将是REQUEST_FILENAME(又名REQUEST_URI).

在您的情况下,SCRIPT_FILENAME将始终为/path/to/index.php,并且可以通过$_SERVER [‘REQUEST_URI’]访问REQUEST_FILENAME / REQUEST_URI.

更新:

REQUEST_URI永远不会是文件名,因为它缺少文档根前缀.当你使用

RewriteCond %{REQUEST_URI} !-f

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

更新:

要真正回答这个问题.

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

REQUEST_FILENAME在PHP中不可用,因为它不在环境中或请求的标头中.

您在PHP中可以看到的只是一些环境变量或标题或PHP可以推断自己的东西.由于PHP没有尝试或无法在请求URI和某些文件名之间建立连接,因此无法在任何地方访问它.毕竟,REQUEST_FILENAME可能位于文件系统的任何位置.

但是,您可以自己将其置于环境中

RewriteRule (.+) index.php?p=$1 [QSA,L,E=REQUEST_FILENAME:%{REQUEST_FILENAME}]

并在PHP中以$_SERVER [‘REDIRECT_REQUEST_FILENAME’]的形式访问它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读