Göreli URL'lerin ters proxy ile doğru şekilde nasıl işleneceği


51

Apache'de aşağıdaki gibi ters proxy kurulumum var:

Www.example.com/folder adresine sahip A sunucusu, ters proxy sunucusudur.

Bu adres: Server B, adresi test.madeupurl.com adresine sahip

Bu tür işler. Ancak karşılaştığım sorun, www.example.com/folder adresinde göreceli bağlantıların tümü, www.example.com/folder/css/examplefilename yerine www.example.com/css/examplefilename.css biçimindedir. css

Bunu nasıl düzeltebilirim?

Şimdiye kadar ters proxy'mde Sunucu A'da (www.example.com):

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>

Aşağıdaki çözümlerden hangisi size hatırlıyorsanız, HBruijn'in cevabında sizin için ne işe yaradı?
Kimberly W

Yanıtlar:


81

Apache ProxyPassRewrite, http://test.example.com adresinden alınan yanıt gövdelerini , yalnızca başlıkları (404 sayfasına yönlendirilenler gibi) yeniden yazmaz .

Bir dizi alternatif:

Bir ) Mutlak yerine göreceli yolları kullanmak için iç uygulamayı yeniden yazın. yani ../css/style.cssyerine/css/style.css

İki ) Dahili uygulamayı /foldertest.example.com'un kökünden ziyade aynı alt dizinde yeniden konuşlandırın.

Üç ) Bir ve iki genellikle gerçekleşmesi muhtemel değildir ... Şanslıysanız, dahili uygulama yalnızca iki veya üç alt dizin kullanır ve bunlar ana sitenizde kullanılmazsa , basitçe bir sürü ProxyPass satırı yazın:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://test.example.com/
ProxyPassReverse /externalpath/  http://test.example.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://test.example.com/css/
ProxyPassReverse /css/  http://test.example.com/css/
ProxyPass /icons/  http://test.example.com/icons/
ProxyPassReverse /icons/  http://test.example.com/icons/

Dört ) Dahili uygulama için ayrı bir alt etki alanı oluşturun ve proxy'yi her şeyin tersine çevirin:

<VirtualHost *:80>
   ServerName app.example.com/
   # Expose Internal App to the internet.
   ProxyPass /  http://test.internal.example.com/
   ProxyPassReverse /  http://test.internal.example.com/
</VirtualHost>

Beş ) Bazen geliştiriciler tamamen kafayı yemişsiniz ve bunların uygulamaları mutlak URL üretmek ancak bu bile ana makine adı kendi URL yer ve elde edilen HTML kodu şöyle içermez sadece vardır: <img src=http://test.example.com/icons/logo.png>.

A ) Bölünmüş ufukta bir DNS ve senaryo 4'ün birleşik çözümünü kullanabilirsiniz. Hem dahili hem de harici kullanıcılar test.example.com adresini kullanır, ancak dahili DNS'niz doğrudan test.example.com sunucusunun ip adresini gösterir. Harici kullanıcılar için test.example.com genel kaydı, genel web sunucunuzun www.example.com adresinin ip adresini gösterir ve daha sonra 4. çözümü kullanabilirsiniz.

B ) Gerçekten test.example.com için yalnızca proxy isteklerini değil , yanıt gövdesini de kullanıcılarınıza iletilmeden önce yeniden yazarak apache elde edebilirsiniz . (Normalde bir proxy yalnızca HTTP başlıklarını / yanıtlarını yeniden yazar). apache 2.2'de mod_substitute. Mod_proxy ile iyi istiflenip test edilmediğini test etmedim, ancak belki de aşağıdakiler işe yarar:

<Location /folder/>
  ProxyPass http://test.example.com/
  ProxyPassReverse http://test.example.com/ 
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|test.example.com/|www.example.com/folder/|i" 
</Location>

4
Kutsal inek iyi cevap. Bunların hiçbirini denemedim, ama sadece yazdığın için teşekkür etmek istedim! Bir milyona yardım eder. Bu fikirlerden bazılarını şimdi test edecek ve kısa bir süre sonra rapor verecek :)
Çalışkan

Lütfen hızlıca sorun lütfen 2. nokta için sizi doğru anlıyorsam efendim, adpp'i test.madeupurl.com/folder için yeniden konuşlandırmamı mı öneriyorsunuz? Bu benim apache yapılandırma dosyasında herhangi bir değişiklik gerektirir mi? Bu en hızlı çözüme benziyor
Çalışkan işçi

Ek olarak, rahatsız ettiğim için üzgünüm ama 1. maddeyle ne denemeyi denediğimde sorduğumda anlattığım sorun devam ediyor. Örneğin burada kullandım: <link rel = "stylesheet" type = "text / css" href = "../ css / custom.css" /> ve tarayıcıdaki link adresi için test.madeupurl.com /css/bootstrap.css ziyade test.madeupurl.com/folder/css/bootstrap.css . Bu konuda herhangi bir öneriniz var mı, en yararlı olur
Çalışkan işçi

Artık DocumentRoot'ta yüklü olan bir uygulamayı / klasörünü, stil sayfaları, simgeler vb. Gibi bir alt dizine yeniden dağıtırken / folder / css ve / folder / icons vb. Dizinlerinde konuşlandırılacaktır <img src=/folder/icons/button.png>. dönüş ProxyPass /folder/ http://test.madeupurl.com/folder/direktif tarafından yakalanacak .
HBruijn

Test.madeupurl.com/content/index.html sayfası test.madeupurl.com/css/custom.css adresini eklemek ister. Bu konumda göreceli URL'yi kullanmalı href="../css/custom.css"ve kullanmamalısınız href="/css/custom.css". İnternet kullanıcısı sayfayı aldığında, URL www.example.com/folder/content/index.html olacaktır. Css için URL daha sonra şöyle olacaktır: www.example.com/folder/content/../css/custom.cssaslında www.example.com/folder/css/custom.cssiletilecek olan test.madeupurl.com/css/custom.css.
HBruijn

8

HBruijn'in cevabının bir tamamlayıcısı olarak (3) "ProxyPass" çözümünü seçerseniz, HTML sayfalarınızdaki bazı URL'leri yeniden yazmak için mod_proxy_html kullanmanız gerekebilir .

bakınız Bazı örnekler için göreceli URL'lerin ters bir proxy ile doğru şekilde nasıl işleneceği .

Bir uygulamalı örnek olarak, burada kullandığınız Apache yapılandırma talimatları aşağıda ProxyHTMLURLMapher şeyi yönlendirilmesini sağlayan bir kural your-domain-name.com/pad sizin için Etherpad portu 9001 yerel olarak çalışan örnek:

<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]


2
Mod_proxy_html'nin yalnızca Apache 2.4 ve üstü
sürümlerde yer aldığına dikkat

Cevabınız kusursuz. Ancak, içeriğin html olmadığı bir durumla karşılaştım, oldukça pdf. ProxyHTMLURLMap kullanmak benim için işe yaramadı. Başka bir önerin var mı?
Mohamed Ennahdi El Idrissi,

2
İçeriğiniz bir PDF ise, içindeki URL'leri yeniden yazmanıza gerek yoktur! Kullanıcılarınızın web sitenizin diğer sayfalarına erişmek için PDF'deki bağlantıları tıklamasını istemediğiniz sürece, bu kulağa zor geliyor. URL yeniden yazmayı devre dışı bırakmak için son 2 yönergeyi atlamanız yeterlidir: SetOutputFilter& ProxyHTMLURLMap.
Lucas Cimon

Kodlama hatalarını önlemek için RequestHeader unset Accept-Encoding eklemeniz gerekebilir
zar3bski

5

Ters proxy yapmak için aşağıdaki yolu kullanabilirsiniz:
1. mod_proxy_html yükleyin

    yum install mod_proxy_html
  1. Mod_proxy_html modülünü yükle

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. Ve aşağıdaki ayarı kullanın

    ProxyRequests off  
    ProxyPass /folder/  http://test.madeupurl.com  
    ProxyHTMLURLMap http://test.madeupurl.com  /folder  
    
    <Location /folder/>  
        ProxyPassReverse /  
        ProxyHTMLEnable On  
        ProxyHTMLURLMap  /  /folder/  
        RequestHeader    unset  Accept-Encoding  
    </Location>  
    

Umarım bu yardım.

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.