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"?
È 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
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 :) –