如何从IIS重写规则获取Symfony请求上下文以使用请求URI?
我在IIS7中为Symfony的请求设置了反向代理重写规则。 它与模式匹配,并传递正确的请求细节,因此从技术角度来看,它是有效的,但Symfony似乎没有使用正确的信息,或者说我希望它使用的信息 在如何从IIS重写规则获取Symfony请求上下文以使用请求URI?,symfony,url-rewriting,iis-7,reverse-proxy,Symfony,Url Rewriting,Iis 7,Reverse Proxy,我在IIS7中为Symfony的请求设置了反向代理重写规则。 它与模式匹配,并传递正确的请求细节,因此从技术角度来看,它是有效的,但Symfony似乎没有使用正确的信息,或者说我希望它使用的信息 在app.php中进行断点以查看symfony从$\u服务器中的其他服务器接收到的内容详细信息此操作的相关参数包括: HTTP\u X\u ORIGINAL\u URL=“/foo/bar/foo/someCall/123456789” REQUEST_URI=“/bar/foo/someCall/1
app.php
中进行断点以查看symfony从$\u服务器中的其他服务器接收到的内容详细信息此操作的相关参数包括:
HTTP\u X\u ORIGINAL\u URL=“/foo/bar/foo/someCall/123456789”
REQUEST_URI=“/bar/foo/someCall/123456789”
(与
(重写规则中的模式)
已为/bar/foo/someCall/{id}
设置路由,但请求上下文仅将pathInfo
设置为/foo/bar/foo/someCall/{id}
,这将导致“不存在路由…”错误
我需要请求上下文(可能是路由侦听器等)来使用request\u URI
中的内容。如果可能的话,如何才能做到这一点呢?当使用反向代理时,您不应该更改应用程序以匹配您的代理url(甚至不应该知道它正在代理后面运行)。代理需要确保向应用程序发送正确的信息。为了做到这一点,您需要了解Syfony如何决定路线是否匹配
默认情况下,Symfony使用请求URI
来确定路由。但它也支持IIS重写规则,然后重写请求URI
值,如下所示:。因此,仅使用请求URI
在这里不起作用
在本例中,有趣的部分是Symfony确定基本URL()的方式。由于您正试图重写URL的基础,因此最好操作作为代理的一部分传递的脚本路径。我不是IIS方面的专家,也不知道它的重写规则是如何工作的,但当使用Nginx作为反向代理时,通常会将X-SCRIPT-NAME
头设置为基本路径,因此,您可以在IIS中尝试类似的操作。IIS生成头HTTP\u ORIGINAL\u URL
作为重写的一部分,不幸的是,由于prepareRequestUri()
函数中的if($this->headers->has('X\u ORIGINAL\u URL'))
的条件,Symfony将覆盖请求URI
从皮埃尔在回答中所说的话出发,他帮助找出了解决这个问题的方法
我们必须调整我们的nginx conf文件,将HTTP\u X\u原始\u URL
改写为空,以便不满足条件,并且不会错误地覆盖REQUEST\u URI
location ~^\/{url}\/? {
...
proxy_set_header X-ORIGINAL-URL "";
...
}
非常感谢您对Symfony如何处理请求和重写的解释和其他信息。:)