2011-09-23 12 views
9

Dicono che il mod_rewrite di Apache è il coltellino svizzero di manipolazione di URL, ma può farlo?Come riscrivere/proxy un URI Apache in un'applicazione in ascolto su una porta/server specifici?

Diciamo che voglio aggiungere una nuova applicazione al mio server web Apache, dove l'unica opzione configurabile dell'app è un numero di porta.

Desidero utilizzare & fornire gli URL del modulo "http://hostname.example.com/app" anziché "http://hostname.example.com:8080". Ciò garantirebbe che anche i clienti passassero attraverso il firewall dell'istituzione, ed è generalmente più ordinato.

La mia applicazione include URI assoluti in php, javascript e css, quindi voglio anteporre la mia posizione di root all'URI nei collegamenti interni delle applicazioni. Non ho accesso ai record DNS e quindi non posso creare un altro server virtuale basato sul nome.

Utilizzando i moduli mod_rewrite e mod_proxy di Apache, posso reindirizzare in modo trasparente un client alla home page corretta dell'applicazione. Ma i collegamenti all'interno di quella homepage non indicano un client ai collegamenti relativi al nuovo URL di base.

Quindi, qual è il modo migliore di inoltrare una richiesta a un'applicazione in ascolto su una porta specifica?

Per esempio, se ho avuto un programma in ascolto sulla porta 8080, ho potuto mettere questo nella mia configurazione di Apache: -

<VirtualHost *:80> 
    SSLProxyEngine On 
    ServerName myhost.example.com 
    RewriteEngine On 
    UseCanonicalName On 
    ProxyVia On 
    <Location "/application"> 
     RewriteRule ^/application/?(.*) http://localhost:8080/$1 [P,L] 
    </Location> 
</VirtualHost> 

Questo avrebbe funzionato bene se l'applicazione non ha utilizzato URL assoluti, ma lo fa. Quello che devo fare è riscrivere gli URL che vengono restituiti dal css dell'applicazione, javascript e php.

Ho esaminato la documentazione di ProxyPass e ReverseProxyPass, ma non penso che funzionino ..?

Ho anche incontrato il numero mod_proxy_html di Nick Kew, ma questo non è incluso nella distribuzione standard di Apache, e il server web della mia istituzione sembra essere andato bene per anni senza di esso .. Altro che trascinare manualmente (o usare un grep -r | espressione di tipo sed) tramite il codice sorgente dell'applicazione o usando questo componente aggiuntivo di terze parti, ci sono altri modi per farlo?

Potrei forse usare alcune delle variabili interne del server in una regola mod_rewrite? Ad esempio una regola di riscrittura basata su "HTTP_REFERER"?

+2

È necessario mod-proxy-html, perché i collegamenti interni nelle pagine Web potrebbero puntare all'esterno di 'application /', se iniziano con '/' (non sono riparabili per proxy, perché ad es. La richiesta '/ img/abc' è ambigua senza contesto: 'application/img/abc' o veramente'/img/abc'). Non puoi aggiustare l'app per usare solo collegamenti relativi? – eudoxos

+0

Ho pensato di rispondere a questo ...: S Le app in questione non sono basate su directory (applicazioni daemon che ascoltano sulla propria porta) e non si riferiscono a nulla al di fuori delle rispettive directory radice. Ho provato a correggere tutti gli URI assoluti in un'unica app (strumenti di percorso), ma questo ha appena ucciso l'app. Anche questo è stato un sacco di lavoro, e avrebbe dovuto essere ripetuto nel caso in cui un aggiornamento sostituisse qualcosa di importante (alcuni dei quali potrebbero essere distribuiti come binari e quindi non sarebbero modificabili, senza dubbio perché questa app si è rotta). Ta tho :) –

risposta

13

Utilizzare mod_proxy funzionerebbe correttamente. Per esempio, ho mappato https://localhost/yalla/ per puntare a una sottodirectory di mio webserver:

LoadModule proxy_module modules/mod_proxy.so 
ProxyRequests On 
<Proxy *> 
     Order deny,allow 
     Allow from localhost 
</Proxy> 
ProxyPass /yalla/ http://yalla.ynfonatic.de/tmp/ 

Se si implementa questa, si noterà che i pictues della directory-listing non sono visibili; questo perché sono sotto la directory/tmp/sul server remoto, quindi non sono visibili.

Quindi, nel tuo caso faresti:

LoadModule proxy_module modules/mod_proxy.so 
ProxyRequests On 
<Proxy *> 
     Order deny,allow 
     Allow from localhost # Or whatever your network is if you need an ACL 
</Proxy> 
ProxyPass /app/ http://hostname.example.com:8080/ 

Come con tutto nella configurazione di Apache, guardare quei slash quando ci si riferisce alle directory.

Buona fortuna! Alex.

+0

Sembra che questo potrebbe funzionare. Ta! Stamattina stavo guardando mod_proxy per vedere il proxy automatico della mia rete domestica attraverso quella di uni .. Questa è una funzionalità completamente diversa da questa però. Ti farò sapere come vado. Saluti! Alex –

+0

Questo sembra far cadere le richieste di opzioni di preflight – nathanengineer

+0

@nathan Per questo potrebbe essere necessario un po 'di salsa mod_rewrite'; Non mi sono mai imbattuto in quell'errore, ma una rapida ricerca ha rivelato questo link: https://songbard.wordpress.com/2011/05/27/coaxing-apache-to-honour-options/ - non sono sicuro, se questo aiuta, ma il feedback è benvenuto YMMV. –

Problemi correlati