web-dev-qa-db-ja.com

MVCアプリケーションでHTTPをHTTPSにリダイレクトする方法(IIS7.5)

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>
50
LLM

Global.asaxで次を使用します。

protected void Application_BeginRequest()
{
  if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection)
  {
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
  }
}
7
Debasis Goswami

コードでそれを行うことができます:

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);
        }
    }
}
110
Chris Kooken

の中に 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();
    }
}
42

単純な場合には、RequireHttpsAttributeを使用できます。

[RequireHttps]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

MSDNで述べられているように...

「保護されていないHTTP要求をHTTPS経由で強制的に再送信する属性を表します。」

RequireHttpsAttribute

ただし、これを使用して大規模なサイトにHTTPSを適用するかどうかはわかりません。たくさんの装飾を行い、コントローラーを見逃す機会があります。

2
Nattrass

ローカルデバッグセッションはカスタムポート番号を使用するため、このように行いました。

    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をプログラムで取得する方法があります...

2
Paul Williams

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>
1
Manish Kumar

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:"));
    }
}
1
Adel Mourad

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>
0
Deepak Jha

この答えはOPのためのものではありませんが、私のように動作させることができず、これに遭遇した人のためです(そしてOPに403ではなく404エラーがあることを知っていますが)、代わりに404を取得している場合はこの答えを参照してください: https://stackoverflow.com/a/6962829/5416602

IISでHTTPSポート(443)だけでなく、HTTPポート(80)のバインドがあることを確認してください

0
Umair Malhi

コメントを追加することはできませんが、この補足情報は誰かに役立つと思います。

Global.asaxのアイデアを301パーマネントリダイレクトで実装し、HTTPバインドをIISのサイトに追加しました。 SSL設定で「SSLを要求する」のチェックを外すことを思い出すまで、403 Forbiddenのままでした。

0
cherry