HTTPサイトをHTTPSにリダイレクトする必要があり、以下のルールを追加しましたが、 http://www.example.com を使用しようとすると403エラーが発生します。 https://www.example.com ブラウザで。
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_Host}/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
Global.asaxで次を使用します。
protected void Application_BeginRequest()
{
if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection)
{
Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
}
}
コードでそれを行うことができます:
Global.asax.cs
protected void Application_BeginRequest(){
if (!Context.Request.IsSecureConnection)
Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:"));
}
または、同じコードをアクションフィルターに追加できます。
public class SSLFilter : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext){
if (!filterContext.HttpContext.Request.IsSecureConnection){
var url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:");
filterContext.Result = new RedirectResult(url);
}
}
}
の中に Global.asax.cs
:
単純なリダイレクト
protected void Application_BeginRequest()
{
if (!Context.Request.IsSecureConnection
&& !Context.Request.IsLocal // to avoid switching to https when local testing
)
{
// Only insert an "s" to the "http:", and avoid replacing wrongly http: in the url parameters
Response.Redirect(Context.Request.Url.ToString().Insert(4, "s"));
}
}
301リダイレクト:SEOベストプラクティス(検索エンジン最適化)
301 Moved Permanently
リダイレクトステータスレスポンスコードは、ユーザーをHTTPからHTTPSにアップグレードするためのベストプラクティスと見なされます( Googleの推奨事項を参照 )。
したがって、GoogleまたはBingのロボットもリダイレクトされる場合は、次のことを考慮してください。
protected void Application_BeginRequest()
{
if (!Context.Request.IsSecureConnection
&& !Context.Request.IsLocal // to avoid switching to https when local testing
)
{
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", Context.Request.Url.ToString().Insert(4, "s"));
Response.End();
}
}
単純な場合には、RequireHttpsAttributeを使用できます。
[RequireHttps]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
MSDNで述べられているように...
「保護されていないHTTP要求をHTTPS経由で強制的に再送信する属性を表します。」
ただし、これを使用して大規模なサイトにHTTPSを適用するかどうかはわかりません。たくさんの装飾を行い、コントローラーを見逃す機会があります。
ローカルデバッグセッションはカスタムポート番号を使用するため、このように行いました。
protected void Application_BeginRequest()
{
if (!Context.Request.IsSecureConnection)
{
if (HttpContext.Current.Request.IsLocal)
{
Response.Redirect(Context.Request.Url.ToString().Replace("http://localhost:25885/", "https://localhost:44300/"));
}
else
{
Response.Redirect(Context.Request.Url.ToString().Replace("http://", "https://"));
}
}
}
できれば、URLとSSL URLをプログラムで取得する方法があります...
Web.configファイルに次のASP.NET MVC書き換えルールがあります:
このコードはweb.configファイルで試すことができます。 URLが http://www.example.com の場合、このURLにリダイレクトされます https://www.example.com 。
<system.webServer>
<rewrite>
<rules>
<rule name="http to https" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_Host}/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
Webサイトがサーバーで起動されたときにのみhttpsを強制し、開発用のマシンでWebサイトを実行しているときにそれを無視するには:
Global.asaxで:
Application_BeginRequest()メソッドが必要になります
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// .....
}
//force https on server, ignore it on local machine
protected void Application_BeginRequest()
{
if (!Context.Request.IsSecureConnection && !Context.Request.Url.ToString().Contains("localhost"))
Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:"));
}
}
http://へのリダイレクトにweb.configファイルでこのコードを使用します
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTPS force" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_Host}{REQUEST_URI}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
この答えはOPのためのものではありませんが、私のように動作させることができず、これに遭遇した人のためです(そしてOPに403ではなく404エラーがあることを知っていますが)、代わりに404を取得している場合はこの答えを参照してください: https://stackoverflow.com/a/6962829/5416602
IISでHTTPSポート(443)だけでなく、HTTPポート(80)のバインドがあることを確認してください
コメントを追加することはできませんが、この補足情報は誰かに役立つと思います。
Global.asaxのアイデアを301パーマネントリダイレクトで実装し、HTTPバインドをIISのサイトに追加しました。 SSL設定で「SSLを要求する」のチェックを外すことを思い出すまで、403 Forbiddenのままでした。