Menggunakan nginx untuk menulis ulang url di dalam respons keluar

8

Kami memiliki pelanggan dengan situs yang berjalan di Apache. Baru-baru ini situs telah melihat peningkatan beban dan sebagai celah berhenti kami ingin mengalihkan semua konten statis di situs ke domain tanpa masak, misalnya http://static.thedomain.com.

Aplikasi ini tidak dipahami dengan baik. Jadi untuk memberi pengembang waktu untuk mengubah kode untuk mengarahkan tautan mereka ke server konten statis ( http://static.thedomain.com), saya berpikir tentang mem-proxy-kan situs melalui nginx dan menulis ulang respons keluar sehingga tautan yang /images/...akan ditulis ulang http://static.thedomain.com/images/....

Jadi misalnya, dalam respon dari Apache ke nginx ada gumpalan Header + HTML. Dalam HTML yang dikembalikan dari Apache kami memiliki <img>tag yang terlihat seperti:

<img src="/images/someimage.png" />

Saya ingin mengubah ini menjadi:

<img src="http://static.thedomain.com/images/someimage.png" />

Sehingga browser setelah menerima halaman HTML kemudian meminta gambar langsung dari server konten statis.

Apakah ini mungkin dengan nginx (atau HAProxy)?

Saya memiliki pandangan sepintas melalui dokumen tetapi tidak ada yang melompat keluar kecuali menulis ulang url masuk.

Kev
sumber

Jawaban:

5

Ada http://wiki.nginx.org/HttpSubModule - "Modul ini dapat mencari dan mengganti teks dalam respons nginx."

salin masa lalu dari dokumen:

Sintaksis:

sub_filter string replacement

Contoh:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}
Oleg Neumyvakin
sumber
Apakah ada yang seperti ini untuk haproxy?
bradvido
@bradvido Saya belum menemukan fitur seperti itu di haproxy.
Oleg Neumyvakin
3

Cara terbaik adalah menggunakan fitur proxy dan mengambil konten dari tempat yang sesuai, bukan menulis ulang URL dan mengirim pengalihan kembali ke browser.

Contoh yang baik dari konten proksi terlihat seperti:

#
#  This configuration file handles our main site - it attempts to
# serve content directly when it is static, and otherwise pass to
# an instance of Apache running upon 127.0.0.1:8080.
#
server {
    listen :80;

    server_name  www.debian-administration.org debian-administration.org;
        access_log  /var/log/nginx/d-a.proxied.log;

        #
        # Serve directly:  /images/ + /css/ + /js/
        #
    location ^~ /(images|css|js) {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }

    #
    # Serve directly: *.js, *.css, *.rdf,, *.xml, *.ico, & etc
    #
    location ~* \.(js|css|rdf|xml|ico|txt|gif|jpg|png|jpeg)$ {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }


        #
        # Proxy all remaining content to Apache
        #
        location / {

            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;

            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      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
}

Dalam konfigurasi ini, alih-alih mengarahkan permintaan ke static.domain.com dan mengharapkan browser untuk membuat permintaan lain, nginx hanya melayani file dari jalur lokal yang relevan. Jika permintaan bersifat dinamis maka proxy menendang dan mengambil respons dari server Apache (lokal atau jarak jauh) tanpa pernah diketahui pengguna akhir.

saya harap itu membantu

Tak
sumber
Terima kasih atas waktu yang dihabiskan untuk menjawab ini. Saya akan menyiapkan rig uji dan melihat bagaimana ini bekerja. Yang penting di sini adalah untuk memindahkan semua konten statis dari server Apache. Jadi saya kira saya bisa menjalankan nginx di server CDN dan telah proxy_passmengatur ke server Apache, misalnya proxy_pass http://172.16.3.1:80? yaitu kami memindahkan alamat IP publik situs ke server nginx / CDN.
Kev
Ya itu benar. Dan tidak ada masalah - saya juga berlutut di nginx sekarang dan menyukainya.
Tak
Belum lupa jawaban Anda :) Masih belum sempat mencoba ini.
Kev