Bir proxy üzerinden geçirilen her sayfadaki mod_rewrite'ın URL'ler için nasıl kullanıldığına benzer içerik değiştirmek mümkün müdür?


12

Bir proxy üzerinden geçirilen her sayfadaki mod_rewrite'ın URL'ler için nasıl kullanıldığına benzer içerik değiştirmek mümkün müdür? İkame ile ilgili belgeler açık değildir.

Ben mutlak yolları olan ters proxy olan bazı sayfalar var. Bu siteyi kırar. Değiştirilmeleri gerekiyor ve mod_rewrite gibi araçlar URL istekleri olmadığı için bunları almıyor.

<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>

Yukarıdakilerin hiçbiri HTML dizesini değiştirmede çalışmaz

<link href="https://serverfault.com//uat.site.co.jp/css/css.css

ile

<link href="https://serverfault.com//uat.site2uk.co.uk/css/css.css

Değişikliklerden sonra Conf:

<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>

Kafam karıştı. Bir HTML aetiketinden geliyor gibi görünüyor . Bu bağlantıyı tıklatmanız büyük olasılıkla bağlantıyı izleyen web tarayıcısına değil, UNC'yi açmaya çalışan bir dosya tarayıcısına (Windows Gezgini) neden olur. Bu dizeyi HTML metninde değiştirmeye mi çalışıyorsunuz?
GregL

Site düzgün çalışıyor. Ancak bir güvenlik duvarının arkasına koyduğumuzda, bir grup css ve görüntüde 404'ler elde ederiz. Normalde her şey 200 alır
ZZ9

Bunlar, IIS sunucusundaki bağlantı etiketlerinden <link href = "// fqdn / asset"
ZZ9

linkEtiketlerde UNC yolları sağlayabileceğinizi sanmıyorum . Yapabiliyorsanız, bunun iyi bir fikir olacağını söyleyemem .. Her durumda, bu sizin sorunuz değil. Apache belgelerine göre , substituteyönerge sadece Directorybloklar veya .htaccessdosyalar için geçerlidir . Bir <location>blok oluşturmayı (/ için olsa bile) deneyin ve yönergeyi oraya koyun.
GregL

2
@GregL, URL'nin bu biçimi "protokole bağlı" bir URL'dir, yaygın olarak bilinmese de sayfalara bağlanmak için mükemmel bir şekilde geçerlidir. "//domain.com/path", tarayıcının belgeyi, bağlantıyı içeren sayfayı istemek için kullanılan protokolle aynı istekte bulunmasını sağlar.
Tero Kilkanen

Yanıtlar:


12

Bunu yapabilen mod_substitute adında bir apache modülü var. Kısa bir örnek:

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

Veya mod_proxy ile birleştirildiğinde:

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"

Mod_substitute için Apache belgelerinde daha fazla bilgi bulunmaktadır .


Merhaba, öneri için teşekkürler, ne yazık ki bu yolda çok şansım olmadı. Yine de başarıyla proxy dışında test ettik. Mod_proxy bunu görmezden geliyor.
ZZ9

Yardımcı olabilecek bazı bilgiler ekledim.
Jenny D

1
Çok teşekkürler, bu işe yarıyor. Apache'nin /etc/httpd/conf.d/ dosyasında .conf (vhost.bak) ile bitmeyen dosyalarımı toplayan bir aksaklık olduğu ortaya çıktı.
ZZ9

7

Apache'yi yeniden başlatmadıysanız, bunu yaptığınızdan emin olun, ancak bunu zaten yaptıysanız, sadece bir nedenle çözüp çözmediğini görmek için değiştirmenizi yapmak için özel bir PHP komut dosyası çalıştıran genel bir çıkış filtresi deneyebilirsiniz. .

DÜZENLEME: Yorumunuza dayanarak, içerik sıkıştırıldığı için yerine geçmeyebilir. Sıkıştırmayı kapatmak için VirtualHost'unuza şu satırları ekleyin:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Bu işe yaramazsa aşağıdakileri deneyin:

Elbette bunları güncelleyerek, bunları kendinize ekleyin:

#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

Proxyfilter.php içinde aşağıdaki gibi bir kod var:

#!/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);

Bu işe yararsa, bunun odağını örneğinizde olduğu gibi yalnızca metin / html içeriğine daraltın.


Sayfada bir HTML 200 alıyorum ancak tarayıcı şunu gösteriyor: İçerik Kodlama Hatası Görüntülemeye çalıştığınız sayfa, geçersiz veya desteklenmeyen bir sıkıştırma biçimi kullandığı için gösterilemiyor.
ZZ9

Ah, bunları VirtualHost'unuza ekleyin. RequestHeader unset Kabul Et-Kodlama ve ayrıca RequestHeader set Kabul Et-Kodlama kimliği
g491

Orijinal yedek hattınızın çalışmasını sağlamak için cevabımı bir şeyle güncelledim. Bunu denemek daha basit ve neler olup bittiğinden önce denemenizi tavsiye ederim.
g491

Harika bir cevap için güncelleme ama ilk önce diğer cevabı aldım
ZZ9

1
Benim durumumda, sıkıştırma oldu, çivilenmişti. Beni delirtiyordu ... çok teşekkür ederim!
Brezilyalı Adam

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.