首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得Symfony请求上下文以使用来自IIS重写规则的REQUEST_URI?

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

Stack Overflow用户
提问于 2017-06-06 11:00:04
回答 2查看 1.1K关注 0票数 0

我在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中的内容。如果有可能的话,如何才能做到呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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也不会被错误地覆盖。

代码语言:javascript
运行
复制
location ~^\/{url}\/? {
    ...
    proxy_set_header X-ORIGINAL-URL "";
    ...
}
票数 0
EN

Stack Overflow用户

发布于 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中尝试类似的操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44388200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档