Saya mencoba menjalankan beberapa container docker yang semuanya menjalankan nginx mendengarkan pada port 80, tetapi dengan pemetaan host port yang berbeda ke port container 80.
Sebagian besar ini berfungsi, kecuali ketika nginx melakukan redirect karena tidak ada garis miring.
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
Dengan konfigurasi nginx di atas dan sebuah docker container yang menjalankannya dengan port host 8080 yang dipetakan ke port container 80, saya bisa mendapatkan localhost: 8080 / docs / via curl ok:
> GET /docs/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:27:05 GMT
< Content-Type: text/html
< Content-Length: 6431
< Last-Modified: Sat, 28 Nov 2015 17:17:06 GMT
< Connection: keep-alive
< ETag: "5659e192-191f"
< Accept-Ranges: bytes
<
... html page ...
tetapi jika saya meminta localhost: 8080 / docs saya mendapatkan redirect ke localhost / docs /
> GET /docs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:29:40 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/docs/
< Connection: keep-alive
<
... html redirect page ...
Bagaimana saya bisa mendapatkan nginx untuk mempertahankan port asli saat melakukan pengalihan? Saya sudah mencoba melihat port_in_redirect dan server_name_in_redirect tetapi mereka tidak membantu.
EDIT
Berdasarkan https://forum.nginx.org/read.php?2,261216,261216#msg-261216 ini tidak terlihat mungkin saat ini.
Jawaban:
Solusi paling sederhana adalah dengan menghapus
index
arahan dan tidak bergantung pada$uri/
pengalihan eksplisit atau implisit . Sebagai contoh:Ini bukan perilaku yang identik karena menghindari pengalihan sama sekali. Jika Anda menginginkan trailing slash redirect seperti yang diberikan oleh modul indeks, maka diperlukan solusi yang lebih kompleks. Sebagai contoh:
sumber
Klien HTTP akan meletakkan porta di header Host. Jika Anda menggunakan nilai asli dari header host saat melakukan pengalihan, itu harus berfungsi seperti yang diharapkan. Saya menguji kode berikut dan terlihat melakukan persis apa yang Anda minta:
sumber
Cukup ikuti perbaikan sederhana ini
sumber
Menarik ... Saya menemukan persis masalah ini dan dapat memperbaikinya seperti yang disarankan oleh jawaban Richard Smith :
Satu-satunya perbedaan adalah bahwa saya tidak menentukan
index.html
?Tentukan kode kesalahan untuk menghindari redirect loop.
Masih menunggu umpan balik dari dukungan nginx.
sumber