Apache重写 - 在PHP中获取原始URL

时间:2011-03-30 22:11:26

标签: php url rewrite

我在nginx或Apache中重写了这个地址:

http://domain.com/hello

到像

这样的脚本
http://domain.com/test.php&ref=hell

如何在PHP中访问此重写的URL?因为,如果我当然使用$_SERVER['REQUEST_URI'],我会得到:

/test.php&ref=hell

但我只想要:

/hello

这可能吗? Thanx寻求帮助。

更新nginx cnf

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

server
{
  listen 80;
  server_name domain.test;


  location /
  {
    rewrite ^/(main|best|air)$ /core/feeds.php?act=$1 last;
    proxy_pass http://127.0.0.1:8080;
  }
}

3 个答案:

答案 0 :(得分:12)

这实际上取决于PHP的设置。使用mod_php,您经常会在REQUEST_URI中拥有原始请求路径。对于CGI或FastCGI设置,它通常是REDIRECT_URL。您必须检查phpinfo()页面才能确定。

如果你真的找不到任何有用的东西,那就是作弊的时候了!您可以像这样调整RewriteRule,以将原始URL保留在选择的环境变量中:

RewriteRule ^(\w+)$   test.php?ref=$1    [E=ORIG_URI:/$1]

然后可以$_SERVER["ORIG_URI"]使用,或者您可以使用$ _GET ['ref']从URI中获取它。 但是你必须在所有潜在的RewriteRules上使用这个技巧。

答案 1 :(得分:6)

您通常可以在

中找到请求的网址
  • $_SERVER['REQUEST_URI']
  • $_SERVER['REDIRECT_URL'](可能只是Apache,不知道nginx)

我知道您提到$_SERVER['REQUEST_URI']包含您的重写网址,但在我的所有测试中,它都包含原始请求。

为什么不转储$_SERVER并查看其中的内容。

答案 2 :(得分:5)

Nginx conf中,我们需要添加request_uri的用户标题:

proxy_set_header request_uri $request_uri;

并在php中阅读:

echo $_SERVER['HTTP_REQUEST_URI'];

<强> UPD

由于某种原因,nginx不喜欢标题名称中的符号'_',不知道它之前是如何工作的,也许在nginx更新后发生了变化。现在我正在使用

proxy_set_header rewriteduri $request_uri;

并在php中

$_SERVER['HTTP_REWRITEDURI']