关于Nginx中$request_uri变量准确定义的权威咨询
我完全懂你的困惑——Nginx文档里那句“full original request URI (with arguments)”乍一看确实容易让人误以为它包含协议、主机这些完整URL的部分,但实际使用时却发现只有路径和查询参数,这种反差太挠头了!
其实咱们得先理清URI和URL的区别:URI是“统一资源标识符”,用来标识资源的位置;而URL是“统一资源定位符”,是URI的子集,包含了协议、主机等完整定位信息。Nginx里的$request_uri对应的是HTTP请求行里的URI部分,也就是客户端发送请求时,请求行里跟在请求方法(GET/POST等)后面的那串内容,它不包含协议、主机和端口。
举个实际的例子:如果用户发起的请求是https://example.com/blog/article?id=123,那么Nginx里的$request_uri的值就是/blog/article?id=123,而完整的URL需要你用$scheme://$host$request_uri来拼接(其中$scheme是协议,$host是请求的主机名)。
关于权威说明,虽然Nginx官方文档的变量描述比较简洁,但在核心模块的官方定义里,$request_uri明确指向“请求行中的原始URI,包含查询参数”——它就是请求发过来时,除了方法和HTTP版本之外的那部分原始内容,完全不会涉及协议和主机,因为那部分是在请求头的Host字段里,不属于URI的范畴。
如果你想验证的话,也可以在Nginx配置里加个简单的测试:
location /test-uri { echo "request_uri: $request_uri"; echo "full URL: $scheme://$host$request_uri"; }
访问https://your-domain.com/test-uri?foo=bar,就能看到$request_uri只返回/test-uri?foo=bar,而完整URL才是带协议和主机的版本。
备注:内容来源于stack exchange,提问作者preferred_anon

