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 it
s 不可能没有解析和其他......
如果搜索 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的主要内容,如果未能解决你的问题,请参考以下文章