是否可以通过PHP访问REQUEST_FILENAME?
参见英文答案 >
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_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或图像文件. 更新: 要真正回答这个问题.
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’]的形式访问它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |