我们的ASP.NET MVC Web应用程序有一些我们用于测试和遗留代码的不同子域。子域名是:
我们故意让表单身份验证不使用域级Cookie,因为我们希望Cookie在这些不同的子域中是唯一的。问题是,当人们获得到根域(sitename.com)的链接时,它需要他们再次登录才能获得cookie,即使他们已经登录www.sitename.com。
有没有办法在仅 www.sitename.com和sitename.com之间共享cookie而不会影响其他子域名?
答案 0 :(得分:5)
您可以使用> IIS7中的UrlRewrite模块将非www域重定向到www来避免此问题
重写规则以放入web.config
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to WWW" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:0}"
redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
答案 1 :(得分:3)
我建议强行使用www。该网站的版本,由于这个原因,这个网站有很好的理由...
http://www.yes-www.org/why-use-www/
要在.net中执行此操作,您可以将以下内容添加到web.config
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to www" stopProcessing="true">
<match url="(.*)" />
<conditions trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^sitename.com$" />
</conditions>
<action type="Redirect" url="{MapProtocol:{HTTPS}}://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent"/>
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol">
<add key="on" value="https" />
<add key="off" value="http" />
</rewriteMap>
</rewriteMaps>
</rewrite>
</system.webServer>
这将永久性地自动重定向(请参阅redirectType =&#34; Permanent&#34;的添加),将非www URL转换为www等效物并保留HTTP(s)协议。
trackAllCaptures部分与正则表达式模式匹配相关 - 在我们的例子中,我们不需要捕获任何东西;我们只需要匹配规则,所以我们可以保持假。
当主机名与&#34; sitename.com&#34;完全匹配时,正则表达式模式^ sitename.com $将匹配 - ^表示起始位置,$表示结束位置
重写地图来自杰夫格雷夫斯的一个想法,我相信,http://jeffgraves.me/2012/11/06/maintain-protocol-in-url-rewrite-rules/
我展示的方式只显示了一种方法,就像大多数事情一样 - 实现这一目标有多种方法。
Scott Forsyth也有一篇关于实现这一目标的不同方式的文章(也参考了Jeff Graves) http://weblogs.asp.net/owscott/url-rewrite-protocol-http-https-in-the-action
答案 2 :(得分:0)
你可以使用像
这样的东西sessionCookie.Domain = ".yourdomain.com" ;
然后您就可以从任何子域请求相同的Cookie并根据需要进行编辑。