【发布时间】:2013-04-02 17:30:55
【问题描述】:
我正在尝试更详细地了解以下 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'] 等值。但似乎 REQUEST_FILENAME 在我当前环境中的任何 PHP $GLOBALS 中都不可用。我确实看到了 SCRIPT_FILENAME 的值,并且一些消息来源说这两个值是相等的,但不清楚它们是否是替代值,或者如果第一个不存在,REQUEST_FILENAME 是否会回退到 SCRIPT_FILENAME。
通过稍微更新 htaccess 规则以输出 URL 中的值,我已经能够输出 REQUEST_FILENAME 值,将最后一行更改为:
RewriteRule (.+) index.php?p=%{REQUEST_FILENAME} [R=302,QSA,L]
但是为什么这个值在 PHP 的任何地方都不可用呢?有什么我忽略的东西可以帮助我了解这个变量的存储位置以及如何通过 PHP 查看它的值?
【问题讨论】:
-
谢谢马克。我想我处理问题的方式有点不同,但这个答案也有帮助。我发现有关 PHP 设置的讨论很有帮助。
-
+1 表示重新打开。报告的重复是关于
REQUEST_URI,而这个问题涉及REQUEST_FILENAME,这是一个完全不同的野兽。 -
不管怎样,我最初的搜索是专门针对 REQUEST_FILENAME 的,对于具有设计背景的人来说,它的行为并不明显。虽然更有经验的 Apache 或 Web 服务器的人可能能够在这两个问题之间建立联系,但这对我来说并不明显,Olaf 的回答确实帮助我从我接近它的方向理解它.
标签: php .htaccess mod-rewrite