2

快速一:

我很好奇是否有人知道在某些情况下$_SERVER['REQUEST_URI']会包含与 不同的值$_GET['_uri'],因为.htaccess后者如下:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ?_uri=$1 [L,QSA]

我一直在使用后一种方法$_GET['_uri'],虽然我知道这mod_rewrite仍然是必要的,但我想避免将 URI 存储为查询参数。


好吧,我发现了一个我以前没有注意到的;当转发到的应用程序引导mod_rewrite不在web根目录中时,$_SERVER['REQUEST_URI']包含父目录,而$_GET['_uri']只包含后一个URI组件。例子:

引导程序正在 请求/subdir/index.php
http://localhost/subdir/foo/bar/baz/

$_SERVER['REQUEST_URI']  "/subdir/foo/bar/baz/"
$_GET['_uri']            "foo/bar/baz/"

为了复制 的结果$_GET['_uri'],决定使用这个:

$prefix = trim(dirname(strtr($_SERVER['PHP_SELF'], '\\', '/')), '/') . '/';
$uri = trim($_SERVER['REQUEST_URI'], '/') . '/';
if(substr($uri, 0, strlen($prefix)) == $prefix){
    $uri = substr($uri, strlen($prefix));
}

但我过去并不$_SERVER['PHP_SELF']经常使用,现在读到它带有某些漏洞和/或与它的使用不一致。

4

1 回答 1

3
http://example.com/meow?param=value&_uri=hihihi
  • 预期$_GET['_uri']结果:meow
  • 实际结果:hihihi
  • $_SERVER['REQUEST_URI']价值:/meow?param=value&_uri=hihihi
  • $_SERVER['REDIRECT_URL']价值:/meow

都是因为[QSA]国旗。

使用$_SERVER['REQUEST_URI']和/或$_SERVER['REDIRECT_URL']代替。

以上是针对Apache的。在 IIS 7.x 上可能会有所不同。

于 2011-07-05T23:57:11.577 回答