在子域内创建顶级域 cookie 不起作用(IIS 重写后的 Express)

问题描述 投票:0回答:1

我想从 sub.example.com 设置顶级域 cookie(即域:“.example.com”)。

我知道我必须像这样设置“域”属性:

const app = express();
app.get("/set", (req, res) => {
  res.cookie("name", "express", { domain: '.example.com', path:'/', httpOnly:true, secure:true, sameSite:'lax' }).send("cookie sety");
});

但是当我从 sub.example.com(浏览器、邮递员等)访问页面时,它总是显示“domain: .sub.example.com”。

该网站在 Windows-Server、IIS 10、Node 20 上运行。

IIS 配置为绑定:sub.example.com、example.com(80 和 443)。

重写配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>                                       
                <rule name="ReverseProxyInboundRule1" patternSyntax="ECMAScript" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:3528/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer> 
</configuration>

我不知道域名在什么时候被“重写”。我检查了网络、堆栈交换和副驾驶。找不到任何线索。

javascript node.js express iis
1个回答
0
投票

我找到了解决方案 - 我会尽力尽可能详细,也许它会对将来的某人有所帮助。

  • 我的 Web 服务器是在 Microsoft Server 2019 Standard 上运行的 IIS 10
  • 网络服务器和互联网之间没有额外的代理、防火墙等
  • IIS 用于域绑定(解析)、SSL 和作为代理
  • 我所有的网站都是基于express/nextjs (nodejs),在同一台机器上的不同端口上运行
  • 在 IIS 内部,我使用重写(参见问题)来中继不同端口的请求

我的情况的问题:在回复标头“set cookie”中,域字段在回复流中的某个时刻被重写为实际域名,包括用于访问该站点的子域。独立于我在 express/nextjs 中发送的 cookie 域。

解决方案:IIS 使用 ARR 3.0(应用程序请求路由)——我并没有真正意识到这一点——默认为“响应标头中的反向重写主机”。这在网站配置中并不真正可见,因为它是在 IIS 服务器级别上配置的 - 我错过了查看。

要更改此设置...

  • 打开 IIS 管理器
  • 单击您的网络服务器打开配置
  • 打开“应用程序请求路由缓存”(在IIS区域)
  • 在右侧面板中单击“服务器代理设置...”
  • 取消选中“在响应标头中反向重写主机”
  • 保存设置

现在,在调用站点时,您的标头将不会为实际用户域重写。就我而言,这就是我想要的,但请记住,您会更改所有网站的行为!因此,请仔细检查您是否没有创建新的错误。

© www.soinside.com 2019 - 2024. All rights reserved.