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

Posted

技术标签:

【中文标题】Apache 重写 - 在 PHP 中获取原始 URL【英文标题】:Apache rewrite - get original URL in PHP 【发布时间】: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 【参考方案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'](也可以注意大小写)

以上是关于Apache 重写 - 在 PHP 中获取原始 URL的主要内容,如果未能解决你的问题,请参考以下文章

Apache在子目录中重写htaccess

apache开启路由重写功能

如何使用 Apache 在代理设置中重写位置响应标头?

PHP/Apache:用 .htaccess 重写规则

phpStudy开启Apache重写模块(开启伪静态)

从 Apache (.htaccess) 到 IIS 问题的 URL 重写