2011-09-23 5 views
9

彼らは、Apacheのmod_rewriteはURL操作のスイス軍ナイフだと言いますが、これを行うことはできますか?特定のポート/サーバで待機しているアプリケーションにApache URIを書き直し/プロキシする方法はありますか?

私は、アプリケーションの唯一の設定可能なオプションがポート番号である私のApache Webサーバーに新しいアプリケーションを追加したいとします。

&は、 "http://hostname.example.com:8080"ではなく "http://hostname.example.com/app"という形式のURLを使用します。これは、クライアントが機関のファイアウォールを通過することを確実にし、一般的にはより巧妙です。

私のアプリケーションには、絶対URIがphp、javascript、およびcssで含まれているため、アプリケーションの内部リンクのURIに自分のルート位置を追加します。私はDNSレコードにアクセスすることができないので、別の名前ベースの仮想サーバーを作成することはできません。

Apacheのmod_rewriteモジュールとmod_proxyモジュールを使用して、クライアントをアプリケーションの適切なホームページに透過的にリダイレクトすることができます。しかし、そのホームページ内のリンクは、新しいベースURLに関連したリンクをクライアントに指示しません。

したがって、特定のポートでリッスンしているアプリケーションに要求をプロキシするにはどうすればよいですか?

私はポート8080でリッスンするアプリケーションを持っていた場合、私は私の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> 

アプリケーションは絶対URLを使用しなかった場合、これは正常に動作しますが、それそうです。私がする必要があるのは、アプリケーションのcss、javascript、およびphpによって返されたURLを書き換えることです。

私はProxyPassとReverseProxyPassのドキュメントを見てきましたが、これらはうまくいくとは思われません。

また、Nick Kewのmod_proxy_htmlも出てきましたが、これは標準のApache Distributionには含まれていません。私の機関のWebサーバーは何年も経っていないようです。手動でトラブリングしたり-r | sed type expression)をアプリケーションのソースコードを通じて使用するか、このサードパーティ製のアドオンを使用して、これについて他の方法がありますか?

おそらくmod_rewriteルールに内部サーバー変数の一部を使用できますか?たとえば、 'HTTP_REFERER'に基づく書き換えルールですか?

+2

ウェブページの内部リンクが '/'で始まる場合、ウェブページの内部リンクが '/'で始まる場合、mod_proxy-htmlが必要です(例えば '/ img/abc'要求があいまいであるためコンテキストなし: 'application/img/abc'または実際には'/img/abc')。相対リンクのみを使用するようにアプリを修正できませんか? – eudoxos

+0

私はこれに答えました:... S 問題のアプリはディレクトリベースではなく(それぞれのポートでリッスンするデーモンアプリケーション)、それぞれのルートディレクトリ以外のものは参照しません。 1つのアプリケーション(経路ツール)で絶対URIのすべてを修正しようとしましたが、これでアプリが殺されました。これはたくさんの作業であり、アップデートが何か重要なものを置き換えた場合には、繰り返す必要があります(そのうちのいくつかはバイナリとして配布することができないため編集不可能です;このアプリが壊れた理由は間違いありません)。 太郎:) –

答えて

13

mod_proxyを使用するとうまく動作します。例えば、私は私のウェブサーバのサブディレクトリを指すようにhttps://localhost/yalla/をマッピングされた:

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

あなたはこれを実装する場合は、ディレクトリ・リストのpictuesが表示されないことに注意しましょう。これは、の下にあるのため、リモートサーバーの/ tmp /ディレクトリには表示されないためです。

だから、あなたのケースでは、あなたは何だろう:ディレクトリを参照する際に、Apacheの設定ではすべてのものを、それらの最後のスラッシュを見

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/ 

同様。

幸運を祈る!アレックス 。

+0

これはうまくいくようです。 Ta! 実際にはmod_proxyを見ていましたが、私のホームネットワークの自動プロキシについてはuniのものを見ていました。これとは全く異なる機能です。 私がどのように乗っているかを教えてくれます。乾杯! Alex –

+0

これは、プリフライトオプションのリクエストをドロップするようです。 – nathanengineer

+0

@nathanそのためには、いくつかの 'mod_rewrite'ソースが必要かもしれません。私はそのエラーに遭遇したことはありませんでしたが、クイック検索でこのリンクが明らかになりました:https://songbard.wordpress.com/2011/05/27/coaxing-apache-to-honour-options/ - それが役に立ったらフィードバックは大歓迎です。 YMMV。 –

関連する問題