web-dev-qa-db-ja.com

nginxでhttp://example.com:12345をhttps://example.com:12345にリダイレクトします

これはすでに答えられているに違いないことは知っていますが、私はかなり長い間探していて、答えを見つけることができません。私が推測する正しい場所を探していないだけで、誰かが私を助けてくれるかもしれません。

基本的に、非標準のポート(この例では12345)でSSLを介してphpmyadminを実行しています。

これで、https://example.com:12345が正常に設定されました。これで、すべてが機能します。ここで、http://example.com:12345と入力して、https://にリダイレクトする機能を追加したいと思います。

以下はうまくいくと思いましたが、うまくいきません。

server {
  listen        12345;
  server_name   php.myadmin.com;

  if ( $scheme = http ) {
    rewrite ^ https://php.myadmin.com:12345$request_uri? redirect;
  }
  root         /var/www/php;

  ssl           on;

  [....]
}

これにより、400 bad requestが得られます。

回答を投稿する前に、リダイレクトフォームをよく見てください。以下のリンクの落とし穴を確認してください。

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

さらに、これがifステートメントなしで実行できると便利です。

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#using-if

5
Saif Bechan

私はまさにこれをします。 gWaldoは正しいですが、HTTPを介してコンテンツを提供するのではなく、リダイレクトするだけです。秘訣は http-on-an-https-portエラーをキャッチ そしてそれを使用してクライアントを正しい場所にバウンスすることです。

server {
    listen   12345;
    server_name  my.domain.com;

    ssl on;
    ssl_certificate /etc/ssl/certs/your.pem;
    ssl_certificate_key /etc/ssl/private/your.key;

    # If they come here using HTTP, bounce them to the correct scheme
    error_page 497 https://$server_name:$server_port$request_uri;
    # Or if you're on the default port 443, then this should work too
    # error_page 497 https://$server_name$request_uri;

    location / {
        # Your config here...
    }
}
18
theJPster

残念ながら、 nginxで単一のポートを使用してhttpおよびhttpsリクエストを処理する はできません。

ただし、できることは、プロキシの事前処理要求を用意することです。これは、スキーム処理を処理する方法です。

set $real_scheme http;
if ($http_x_forwarded_proto) { set $real_scheme $http_x_forwarded_proto; }

set $target_scheme https;

if ($real_scheme != $target_scheme) {
  rewrite ^ $target_scheme://$Host$request_uri redirect;
}
1
gWaldo