Apakah mungkin untuk mengganti konten pada setiap halaman yang dilewatkan melalui proxy yang mirip dengan bagaimana mod_rewrite digunakan untuk URL?

11

Apakah mungkin untuk mengganti konten pada setiap halaman yang dilewatkan melalui proxy yang mirip dengan bagaimana mod_rewrite digunakan untuk URL? Dokumentasi tentang pengganti tidak jelas.

Saya memiliki beberapa halaman, saya membalikkan proxy yang memiliki jalur absolut. Ini merusak situs. Mereka perlu diganti dan alat-alat seperti mod_rewrite tidak mengambilnya karena bukan permintaan URL.

<VirtualHost *:80>
    ServerName  servername1
    ServerAlias servername2

    ErrorLog "/var/log/proxy/jpuat_prox_error_log"
    CustomLog "/var/log/proxy/jpuat_prox_access_log" common

    RewriteEngine on
    LogLevel alert rewrite:trace2
    RewriteCond %{HTTP_HOST} /uat.site.co.jp$ [NC]
    RewriteRule ^(.*)$ http://jp.uat.site2uk.co.uk/$1 [P]

    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|i"


    ProxyRequests Off

    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyPass / http://uat.site.co.jp/
    ProxyPassReverse / http://uat.site.co.jp/
</VirtualHost>

Tidak satu pun di atas berfungsi untuk mengganti string HTML

<link href="/server///uat.site.co.jp/css/css.css

dengan

<link href="/server///uat.site2uk.co.uk/css/css.css

Konf setelah perubahan:

<VirtualHost *:80>
    ServerName  jp.uat.site2uk.co.uk
    ServerAlias uat.site.co.jp
    ErrorLog "/var/log/proxy/jpuat_prox_error_log"
    CustomLog "/var/log/proxy/jpuat_prox_access_log" common
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://uat.site.co.jp/
    ProxyPassReverse / http://uat.site.co.jp/
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|ni"
</VirtualHost>
ZZ9
sumber
Saya bingung. Sepertinya itu dari atag HTML . Mengklik tautan itu kemungkinan tidak akan menghasilkan peramban web mengikuti tautan, melainkan peramban berkas (Windows Explorer) yang mencoba membuka UNC. Apakah Anda mencoba mengganti string itu dalam teks HTML?
GregL
Situs mereka berfungsi dengan benar. Namun begitu kita meletakkannya di belakang firewall kita tentu mendapatkan 404 pada sekelompok css dan gambar. Biasanya semuanya mendapat 200
ZZ9
Mereka berasal dari tag tautan pada server IIS <tautan href = "// fqdn / asset"
ZZ9
Saya tidak berpikir Anda bisa memberikan jalur UNC dalam linktag. Jika Anda bisa, saya tidak bisa mengatakan itu akan menjadi ide yang bagus .. Bagaimanapun, itu bukan pertanyaan Anda. Menurut dokumentasi Apache , substitutearahan hanya valid di dalam Directoryblok atau .htaccessfile. Coba buat <location>blok (bahkan jika itu untuk /) dan masukkan arahan di sana.
GregL
2
@GregL, format URL ini adalah URL "protokol-relatif", ini adalah cara yang sah untuk menautkan ke halaman, meskipun tidak diketahui secara umum. "//domain.com/path" membuat browser meminta dokumen dengan protokol yang sama yang digunakan untuk meminta halaman yang berisi tautan.
Tero Kilkanen

Jawaban:

11

Ada modul apache bernama mod_substitute yang dapat melakukan ini. Ini contoh singkatnya:

<Location "/">
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s/uat.site.co.jp/jp.uat.site2uk.co.uk/ni"
</Location>

Atau, ketika dikombinasikan dengan mod_proxy:

ProxyPass / http://uat.site.co.jp/
ProxyPassReverse / http://uat.site.co.jp/

Substitute "s|http://uat.site.co.jp/|http://jp.uat.site2uk.co.uk/|i"

Ada informasi lebih lanjut di dokumentasi Apache untuk mod_substitute .

Jenny D
sumber
Hai, terima kasih atas sarannya, sayangnya saya belum beruntung di jalan ini. Saya telah mengujinya di luar proxy berhasil. Tampaknya mod_proxy mengabaikannya.
ZZ9
Saya menambahkan beberapa info lagi yang mungkin bisa membantu.
Jenny D
1
Terima kasih banyak, ini berhasil. Ternyata menjadi kesalahan dengan Apache mengambil cadangan file saya di /etc/httpd/conf.d/ yang tidak berakhir dengan .conf (vhost.bak).
ZZ9
7

Jika Anda belum memulai ulang Apache, pastikan untuk melakukannya, tetapi jika Anda sudah melakukannya, Anda dapat mencoba filter keluaran global yang menjalankan skrip PHP khusus untuk melakukan penggantian hanya untuk melihat apakah itu menyelesaikannya karena suatu alasan .

EDIT: berdasarkan komentar Anda, bisa jadi pengganti itu tidak berfungsi karena kontennya dikompres. Untuk mematikan kompresi, tambahkan baris ini ke VirtualHost Anda:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Jika itu tidak berhasil, coba yang berikut ini:

Tambahkan ini ke conf Anda, memperbarui jalur tentu saja:

#add this outside of any VirtualHost tags
ExtFilterDefine proxiedcontentfilter mode=output cmd="/usr/bin/php /var/www/proxyfilter.php"

#add these in your VirtualHost tag
RequestHeader unset Accept-Encoding 
RequestHeader set Accept-Encoding identity
SetOutputFilter proxiedcontentfilter

Di proxyfilter.php ada beberapa kode seperti berikut:

#!/usr/bin/php
<?php
$html = file_get_contents('php://stdin');
$html = str_ireplace('uat.site.co.jp', 'jp.uat.site2uk.co.uk', $html);
file_put_contents('php://stdout', $html);

Jika ini berhasil, maka persempit fokus ini menjadi hanya teks / konten html seperti yang Anda miliki dalam contoh Anda.

G491
sumber
Saya mendapatkan HTML 200 pada halaman tetapi browser menunjukkan: Kesalahan Pengodean Konten Halaman yang Anda coba lihat tidak dapat ditampilkan karena menggunakan bentuk kompresi yang tidak valid atau tidak didukung.
ZZ9
Ah, tambahkan ini ke VirtualHost Anda. RequestHeader tidak disetel Terima-Pengkodean dan juga RequestHeader mengatur identitas Terima-Pengkodean
g491
Saya memperbarui jawaban saya dengan sesuatu untuk mencoba membuat saluran pengganti asli Anda berfungsi. Saya akan merekomendasikan mencoba yang pertama karena lebih mudah untuk dicoba dan mungkin apa yang terjadi.
g491
Perbarui untuk jawaban yang hebat, tetapi saya mendapat jawaban lain yang berfungsi pertama
ZZ9
1
Dalam kasus saya, itu adalah kompresi, berhasil. Itu membuatku gila ... terima kasih banyak!
Orang Brasil itu