【问题标题】:Apache rewrite - get original URL in PHPApache 重写 - 在 PHP 中获取原始 URL
【发布时间】:2011-07-26 11:18:10
【问题描述】:

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

http://domain.com/hello

到像这样的脚本

http://domain.com/test.php&ref=hell

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

/test.php&ref=hell

但我只想:

/hello

这可能吗?感谢您的帮助。

更新 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;
  }
}

【问题讨论】:

  • 你能发布你的重写代码吗?在 apache 中,REQUEST_URI 应该返回用户用来访问页面的 URI。这是我在使用 modrewrite 时得到的行为。我不禁认为你做的是重定向而不是 modrewrite

标签: php url rewrite


【解决方案1】:

这真的取决于 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 使用这个技巧。

【讨论】:

    【解决方案2】:

    您通常可以在

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

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

    你为什么不转储$_SERVER 看看里面有什么。

    【讨论】:

    • 不是有人问过它,但为了将来搜索时参考,$_SERVER['HTTP_X_ORIGINAL_URL'] 用于使用 IIS 重写模块的 IIS7+
    • 试图做 print_r($_SERVER) 但 dont see what i wanna get, maybe its 不可能没有解析和其他......
    • 如果搜索 apache2 :$_SERVER['REDIRECT_QUERY_STRING']
    【解决方案3】:

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

    proxy_set_header request_uri $request_uri;
    

    并在php阅读:

    echo $_SERVER['HTTP_REQUEST_URI'];
    

    更新

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

    proxy_set_header rewriteduri $request_uri;
    

    在php中

    $_SERVER['HTTP_REWRITEDURI']
    

    【讨论】:

    • 应该注意的是,一些 apache 配置会像这样在 env vars 前添加 'HTTP_',所以它可能在 $_SERVER['request_uri'](也可以注意大小写)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多