我在IIS7中为Symfony的请求设置了一个反向代理重写规则。它与模式匹配,并传递正确的请求细节,因此从技术角度来看,它正在工作,但Symfony似乎没有使用正确的信息,更确切地说,使用我希望它使用的信息。
要查看symfony从$_SERVER
中的其他服务器接收到什么信息,请在$_SERVER
中进行突破,相关参数如下:
HTTP_X_ORIGINAL_URL="/foo/bar/foo/someCall/123456789"
REQUEST_URI="/bar/foo/someCall/123456789"
(重写规则中的模式匹配的内容)已经为/bar/foo/someCall/{id}
设置了路由,但是请求上下文只将pathInfo
设置为/foo/bar/foo/someCall/{id}
,这将导致“无路由存在.”错误。
我需要请求上下文(可能是路由、侦听器等)来使用REQUEST_URI
中的内容。如果有可能的话,如何才能做到呢?
发布于 2017-06-07 12:34:37
IIS作为重写的一部分生成头HTTP_X_ORIGINAL_URL
,不幸的是,由于if ($this->headers->has('X_ORIGINAL_URL'))
函数中if ($this->headers->has('X_ORIGINAL_URL'))
的条件,Symfony将覆盖prepareRequestUri()
。
从皮埃尔在回答中所说的话出发,他帮助弄清楚了如何解决这个问题。
我们必须将nginx文件调整为“覆盖”HTTP_X_ORIGINAL_URL
,使其为空,这样就不会满足条件,并且REQUEST_URI
也不会被错误地覆盖。
location ~^\/{url}\/? {
...
proxy_set_header X-ORIGINAL-URL "";
...
}
发布于 2017-06-06 21:26:54
当使用反向代理时,您不应该更改您的应用程序以匹配您的代理url (甚至注意到它正在运行在代理后面)。相反,代理需要确保它向应用程序发送正确的信息。为了做到这一点,您需要了解Syfony是如何决定一个路由是否匹配的。
在默认情况下,Symfony使用REQUEST_URI
来确定路由。但是它也支持IIS重写规则,然后重写REQUEST_URI
值,如下所示:https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpFoundation/Request.php#L1684-L1717。因此,仅仅与REQUEST_URI
合作在这里是行不通的。
在本例中,有趣的部分是Symfony确定基本URL (https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpFoundation/Request.php#L1729-L1752)的方式。由于您正在尝试重写URL的基础,您最好的选择是操作作为代理一部分传递的脚本路径。我不是IIS方面的专家,也不是重写规则的专家,但是当使用Nginx作为反向代理时,通常会将X-SCRIPT-NAME
头设置为基本路径,这样就可以在IIS中尝试类似的操作。
https://stackoverflow.com/questions/44388200
复制相似问题