Nginx: https:// を http:// に書き換える

Nginx: https:// を http:// に書き換える

https://私は、サーバーのプレフィックスがto であるサイトへの受信リクエストを Nginx に書き換えさせようとしていますhttp://(これは、このサイトで使用されている CMS が相対パスではなく URI を強制するためです。つまり、画像、スクリプト、およびスタイルシートが利用できなくなり、サイト全体が壊れてしまいます)。

私は現在、前任者が導入した既存のディレクティブを改良しようとしていますが、Nginx の設定構文に関する知識が限られていることに気づきました。コードは次のとおりです。

if ($ssl_protocol = "") {
    rewrite ^   https://$http_host$request_uri? permanent;
}

http://からへの強制的な書き換えを防ぐために、現在このコードをコメントアウトしていますhttps://が、サイトを壊さずにプロセスを元に戻すことはできません。これまでに試したことは次のとおりです。

if ($ssl_protocol = "https") {
    rewrite ^   http://$http_host$request_uri? permanent;
}

そして

# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
    rewrite ^   http://$http_host$request_uri? permanent;
}

最初のものは効果がないようです。クライアントに送信される HTML は、書き換えられていない HTTPS リクエストを引き続き行います。

2 番目のスニペットも効果がないようです。私が正しく理解していれば (それでも少し驚いていますが)、Nginx はブール値の否定をサポートしていません。

これを行う最善の方法(または実用的な方法)は何でしょうか?

編集:@NathanC の回答のコードを追加してみましたが、この無条件の書き換えによりリダイレクト ループが発生します。引き続きご協力をお願いいたします。

答え1

よりクリーンな方法は次のとおりです。

if ( $scheme = "https" ) {
    return 301 http://example.com$request_uri

または、Nathanの回答との間、デフォルトのSSLサーバーブロックには、単にreturn 301 (どの SSL ブロックであっても、どのように実装され、適応されているかをよく調べる必要があります)単純なリダイレクトに正規表現を使用する意味はない

return-http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

$https編集: if ステートメントで代わりに使用できる変数があることに気付きました。" "httpsでない場合は戻ります:

if ( $https = "on" ) {
    ...

302変更をテストする際は、1 時間前に修正したのにブラウザに変更が反映されていないことに気付いたときに慌てないように、永続的なリダイレクトではなく一時的なリダイレクトを使用する301必要があることに注意してください :)

答え2

次のようにして、すべての https トラフィックを http に強制することができるので、これは必要ありません。

server {
        listen 443;
        ssl on;
        server_name example.com;
        rewrite ^(.*) http://example.com$1 permanent;
 }

参照:https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http

関連情報