Nginx + Apache trailing slash redirect [ditutup]

8

Saya memiliki Nginxserver yang berjalan pada 80port yang berfungsi sebagai proxy Apache 2.2yang sedang didengarkan127.0.0.1:8080

Ketika saya mengaksesnya http://hostname/subfolder/berfungsi dengan baik.
Ketika saya mengaksesnya http://hostname/subfoldermengarahkan saya ke http://hostname:8080/subfolder/yang salah.

Sejauh yang saya lihat redirect yang salah dikembalikan oleh Apache tetapi UseCanonicalNamedan UseCanonicalPhysicalProxykeduanya diatur keOff

Adakah Ide tentang cara memperbaikinya?

quark
sumber
Masalahnya muncul dengan konfigurasi nginx Anda mengingat akses Anda ke port 80 tanpa garis miring menghasilkan pengalihan ke port 8080. KECUALI nginx Anda adalah proxy-proxy ke Apache dan Apache memesan redirect.
PP.
Saya menggunakan nginx sebagai proxy
quark

Jawaban:

5

Saya juga mengalami hal ini, dan saya dapat memperbaikinya dengan direktif proxy_redirect tepat setelah direktif proxy_pass saya dalam konfigurasi nginx saya:

proxy_redirect http://example.com:8080/ http://example.com/ 

Ini adalah konfigurasi nginx lengkap saya (Dalam kasus saya, Apache ada di port 81 dan hosting dua situs. Saya menambahkan dua baris proxy_redirect khusus-situs karena saya tidak yakin bagaimana cara menambahkan satu generik tunggal.)

server {
    listen 80;

    access_log /var/log/nginx/apache-proxy.access.log;

    location / {
        proxy_pass http://localhost:81;

        #fix for apache redirects that include the port number
        proxy_redirect http://nfriedly.com:81/ http://nfriedly.com/;
        proxy_redirect http://misticflame.com:81/ http://misticflame.com/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size 10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 6000;
        proxy_send_timeout 6000;
        proxy_read_timeout 6000;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        send_timeout 6000;
        proxy_buffering off;
        proxy_next_upstream error;

    }
}

Catatan: Ini untuk versi nginx 5+ tahun pra-1.0. Inilah dokumen untuk proxy_redirect untuk versi saat ini: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Nathan Friedly
sumber
menambahkan proxy_redirect memberikan kesalahan sintaksis
TomSawyer
Ini pada versi nginx yang cukup lama. Saya tidak lagi menggunakan nginx (hanya konten statis pada halaman github untuk situs pribadi saya), tetapi saya memperbarui jawabannya dengan tautan ke dokumen proxy_redirect saat ini.
Nathan Friedly
Dengan cara ini, Anda masih mendapatkannya lebih lambat karena pengarahan ulang
TomSawyer
2

Jika direktif ServerName Anda di Apache diatur ke "hostname: 8080", hapus ": 8080" atau ubah menjadi "hostname: 80". Anda juga dapat menambahkan "proxy_set_header Host $ host: 80"

pengguna71577
sumber
1

Saya memiliki masalah ini sejak lama .. Seperti yang saya ingat ada hubungannya dengan HTTP RFC, slash pada akhirnya menunjukkan direktori (/ test /), tidak ada slash pada akhirnya file (/ test)

Singkatnya, tambahkan aturan penulisan ulang yang akan menambahkan garis miring pada permintaan, jika tidak ada.

lihat Solved: masalah trailing slash dengan server Nginx

HTP

Mihai
sumber
1

Saya mengalami masalah yang tepat baru-baru ini. Sementara solusi yang disarankan akan berhasil, Nginx menawarkan solusi bawaan:

proxy_redirect default;

Dokumentasi di http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Berikut ini adalah contoh lengkap cara menggunakannya:

server {
  listen 80;
  location / {
    proxy_pass http://localhost:8080
    proxy_redirect default
  }
}
Dylan Wood
sumber
0

Mungkin nginx tidak mengatur header proxy untuk memberi tahu apache seperti apa bentuk permintaan aslinya.

Dalam nginx:

proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Lihat http://wiki.nginx.org/LikeApache

kacang polong
sumber