跳转到没有 www 的 https,同时跳过 localhost
Redirect to https without www, while skipping localhost
我正在尝试在 Asp.Net 项目中设置重写规则。
重写到 https 并删除任何 "www."
目前在生产中有效,但是当我尝试在本地主机上 运行 它时,它一直将它重定向到 https。
它是 运行在 Azure 上的一个 Umbraco 站点。这就是第一条规则存在的原因。
这是目前的样子:
我有一个规则和两个条件试图跳过本地主机的重定向,但它们都不起作用。
<system.webServer>
<rewrite>
<rules>
<rule name="AlwaysOn agent requests without any redirections" stopProcessing="true">
<match url="^$"/>
<conditions>
<add input="{HTTP_USER_AGENT}" pattern="^AlwaysOn$"/>
</conditions>
<action type="None"/>
</rule>
<rule name="Skip it all, if on localhost" stopProcessing="true">
<match url="^localhost$"/>
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost$"/>
</conditions>
<action type="None"/>
</rule>
<rule name="Remove www" stopProcessing="true">
<match url="(.*)"></match>
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost$" negate="true" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost$" negate="true" />
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
void Application_BeginRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.Request.IsLocal)
return;
if (!Request.IsSecureConnection)//always https!!!
{
var _nfn = "https://" + (Request.Url.Host + Request.RawUrl).ToLowerInvariant();
Response.RedirectPermanent(_nfn);
return;
}
}
我想通了,通过使用其中一种在线正则表达式工具,看看“^localhost$
”是否匹配我的本地主机 url。
事实证明它没有。
将正则表达式更改为简单的“(localhost:)
”修复了它。
我还删除了第二条规则,其中只有 localhost,因为它没有做任何事情,并且有机会 "Remove www" 匹配 url abit。
这是我最终得到的结果:
<system.webServer>
<rewrite>
<rules>
<rule name="AlwaysOn agent requests without any redirections" stopProcessing="true">
<match url="^$"/>
<conditions>
<add input="{HTTP_USER_AGENT}" pattern="^AlwaysOn$"/>
</conditions>
<action type="None"/>
</rule>
<rule name="Remove www" stopProcessing="true">
<match url="(.*)\/\/www\.(.*)$"></match>
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
</conditions>
<action type="Redirect" url="https://{C:2}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
<rule name="Redirect HTTP to HTTPS" stopProcessing="true">
<match url="^(.*)$"/>
<conditions>
<add input="{HTTPS}" pattern="^OFF$"/>
<add input="{HTTP_HOST}" matchType="Pattern" pattern="(localhost:)" negate="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent"/>
</rule>
</rules>
</rewrite>
</system.webServer>
我正在尝试在 Asp.Net 项目中设置重写规则。
重写到 https 并删除任何 "www."
目前在生产中有效,但是当我尝试在本地主机上 运行 它时,它一直将它重定向到 https。
它是 运行在 Azure 上的一个 Umbraco 站点。这就是第一条规则存在的原因。
这是目前的样子: 我有一个规则和两个条件试图跳过本地主机的重定向,但它们都不起作用。
<system.webServer>
<rewrite>
<rules>
<rule name="AlwaysOn agent requests without any redirections" stopProcessing="true">
<match url="^$"/>
<conditions>
<add input="{HTTP_USER_AGENT}" pattern="^AlwaysOn$"/>
</conditions>
<action type="None"/>
</rule>
<rule name="Skip it all, if on localhost" stopProcessing="true">
<match url="^localhost$"/>
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost$"/>
</conditions>
<action type="None"/>
</rule>
<rule name="Remove www" stopProcessing="true">
<match url="(.*)"></match>
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost$" negate="true" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost$" negate="true" />
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
void Application_BeginRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.Request.IsLocal)
return;
if (!Request.IsSecureConnection)//always https!!!
{
var _nfn = "https://" + (Request.Url.Host + Request.RawUrl).ToLowerInvariant();
Response.RedirectPermanent(_nfn);
return;
}
}
我想通了,通过使用其中一种在线正则表达式工具,看看“^localhost$
”是否匹配我的本地主机 url。
事实证明它没有。
将正则表达式更改为简单的“(localhost:)
”修复了它。
我还删除了第二条规则,其中只有 localhost,因为它没有做任何事情,并且有机会 "Remove www" 匹配 url abit。
这是我最终得到的结果:
<system.webServer>
<rewrite>
<rules>
<rule name="AlwaysOn agent requests without any redirections" stopProcessing="true">
<match url="^$"/>
<conditions>
<add input="{HTTP_USER_AGENT}" pattern="^AlwaysOn$"/>
</conditions>
<action type="None"/>
</rule>
<rule name="Remove www" stopProcessing="true">
<match url="(.*)\/\/www\.(.*)$"></match>
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
</conditions>
<action type="Redirect" url="https://{C:2}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
<rule name="Redirect HTTP to HTTPS" stopProcessing="true">
<match url="^(.*)$"/>
<conditions>
<add input="{HTTPS}" pattern="^OFF$"/>
<add input="{HTTP_HOST}" matchType="Pattern" pattern="(localhost:)" negate="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent"/>
</rule>
</rules>
</rewrite>
</system.webServer>