web-dev-qa-db-ja.com

nginxは301リダイレクト時にポート番号を保持します

Webアプリの2番目のブランドを最初のブランドに折りたたんで、301リダイレクトを使用して長引くトラフィックをリダイレクトしようとしています。サーバーは、ポート8001で転送するVagrantボックスで実行されています。

の代わりに https:// local-dev-url:8001/foo /(anything)301からhttps:// local-dev-url:8001 /(anything)

の代わりに https:// local-dev-url:8001/adminfoo /(anything)301からhttps:// local-dev-url:8001/admin /(anything)

これが私が持っているものです:

    location ~ /foo/?(.*)$ {
        return 301 $1/;
    }

    location ~ /adminfoo/?(.*)$ {
        return 301 admin/$1/;
    }

    location / {
        proxy_set_header Host $http_Host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header Authorization $http_authorization;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:5000;
        proxy_redirect http:// $scheme://;
    }

    location /admin/ {
        alias /hostonly/path/to/admin/stuff/;
    }

ただし、https:// local-dev-url:8001/foo /にリダイレクトする代わりにhttps:// local-dev-url:8001 /301ing tohttps:// local-dev-url //代わりに。 (ポート番号なし、余分なスラッシュ。)リダイレクトのURLをハードコーディングする回答を見てきましたが、他の多くの開発者と協力しており、全員が一意のローカル開発者URLを持っているため、一貫性のある部分は次のとおりです。 8001ポート番号。

希望どおりに機能するように301を構成する方法はありますか?

8
David Millar

nginxがポート8001でリッスンしていない場合、リダイレクトで使用するポートを知ることができません。明示的に指定する必要があります。

location ~ /foo(.*)$ {
    return 301 $scheme://$http_Host$1;
}
location ~ /adminfoo(.*)$ {
    return 301 $scheme://$http_Host/admin$1;
}

$http_Host変数は、元のリクエストのホスト名とポートで構成されます。詳細については、 このドキュメント を参照してください。

20
Richard Smith

私にとっては、proxy.confの次の行を次のように編集して、トリックを実行しました。

proxy_set_header Host $http_Host;
proxy_set_header X-Forwarded-Host $http_Host;
0