如何获得Symfony请求上下文来使用IIS重写规则中的请求_URI



i在IIS7中设置了反向代理重写规则,以要求对Symfony请求。它与模式匹配并传递了正确的请求详细信息,因此从技术角度起作用,但是Symfony似乎没有使用正确的信息或我希望它使用的信息。

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中的内容。如果可能的话,如何能够这样做?

使用反向代理时,您不应该更改应用程序以匹配您的代理URL(甚至要注意的是在代理后面运行(。相反,代理需要确保它将正确的信息发送给您的应用程序。为了做到这一点,您需要了解Syfony如何决定路线是否匹配。

Symfony默认情况下使用REQUEST_URI来确定路由。但它也支持IIS重写规则,然后覆盖REQUEST_URI值,可以在此处看到:https://github.com/symfony/symfony/symfony/symfony/blob/2.8/src/symfony/symfony/component/component/httpon--l1717。因此,仅使用REQUEST_URI工作就无法使用。

在这种情况下,有趣的部分是Symfony确定基本URL的方式(https://github.com/symfony/symfony/symfony/symfony/blob/2.8/src/symfony/symfony/symfony/component/component/httpontation/reqhpfundation/reqhp#lp#l1729-l1729-l1729-l17522(。由于您正在尝试重写URL的底座,因此最好的选择是操纵作为代理的一部分传递的脚本路径。我不是IIS的专家,也不是它的重写规则的工作方式,但是当使用Nginx作为反向代理时,通常会将X-SCRIPT-NAME标头设置为基本路径,因此您可以在IIS中尝试类似的东西。

<</p>

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

从皮埃尔(Pierre(在答案中谈到的话,他协助弄清楚了如何解决问题。

我们必须将我们的nginx conf文件调整为"覆盖" HTTP_X_ORIGINAL_URL为空,以使情况无法满足,并且REQUEST_URI没有错误地覆盖。

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

最新更新