如何获取Symfony请求上下文以使用来自IIS重写规则的REQUEST_URI?

问题描述:

我在IIS7中为Symfony的请求设置了一个反向代理重写规则。 它匹配模式并传递正确的请求细节,所以从技术角度来看,它正在工作,但Symfony似乎并未使用正确的信息,而是我希望它使用的信息。如何获取Symfony请求上下文以使用来自IIS重写规则的REQUEST_URI?

设置断点在app.php看到什么symfony的来自其他服务器接收的$_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中的内容。如果可能的话,人们如何能够这样做?

IIS生成标题HTTP_X_ORIGINAL_URL作为重写的一部分,不幸的是,由于prepareRequestUri()函数中if ($this->headers->has('X_ORIGINAL_URL'))的条件,Symfony将覆盖REQUEST_URI

从皮埃尔的回答中可以看出,如何解决问题。

我们不得不调整我们的nginx conf文件以'覆盖'HTTP_X_ORIGINAL_URL为空,因此条件不符合并且REQUEST_URI未被错误覆盖。

location ~^\/{url}\/? { 
    ... 
    proxy_set_header X-ORIGINAL-URL ""; 
    ... 
} 

使用反向代理时,您不应该更改您的应用程序以匹配您的代理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中尝试类似的方法。

+0

非常感谢Pierre对Symfony处理请求和重写的解释和附加信息。 :) – ddtpoison777