mod_rewrite& PHP; $ _SERVER ['REQUEST_URI']与mod_rewrite

时间:2011-07-05 23:49:31

标签: php mod-rewrite uri server-variables

快点:

我很好奇是否有人知道某些情况下$_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转发不在根网站目录中的应用程序引导程序时,$_SERVER['REQUEST_URI']包含父目录,而$_GET['_uri']仅包含后一个URI组件。例如:

  

Bootstrap /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'],现在已经知道它带有某些漏洞和/或它的使用不一致。

1 个答案:

答案 0 :(得分: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上可能有点不同。