• 締切済み

公開サーバーの特定のURL、特定のポートへのリクエストを別のポートで処

公開サーバーの特定のURL、特定のポートへのリクエストを別のポートで処理したいと思います。 環境は、 OSがcentos-release-5-5.el5.centos、 Apacheがhttpd-2.2.3-43.el5.centos.3(CentOS同梱のapache2です) を使用しています。 WEBサーバーとして、特に変な事をしない通常の運用は問題なく出来るようになっています。 今回行いたい事の具体的な内容なのですが、 例として、特定のURL=www.foo.net/bar、特定のポート=12345、処理したい別ポート=80とします。 この時、対象となるリクエストは www.foo.net:12345/bar です。 上記のリクエストを受けた時、 www.foo.net:80/bar と読み替えて処理したいです。 この後、後続の処理へと続いていきます。 (具体的にはAJPコネクタ経由でtomcatのアプリが叩かれます。 AJPコネクタを利用したtomcatとの連携自体は動作の確認が取れています) また、この時、上記特定のURL,ポート以外の組み合わせではリソースにアクセスできないようにしたいです。 例として、 www.foo.net/bar www.foo.net:*(12345以外のポート)/bar www.foo.net:12345/*(bar以外の文字列) 等のリクエストを受けた場合は、後続の処理を行わず、一律HTTP403エラーとして処理したいです。 ただし、上記特定のURL,ポートと全く無関係なリソースへのアクセスには、影響を与えたくはありません。 ここで言う全く無関係なリソースとは、例として、 www.foo.net/*(bar以外の文字列) www.foo.net:*(12345以外のポート)/*(bar以外の文字列) 等です。 わりと特殊な事をしようとしているのかと思います。 色々と調べておりますが、自分が欲しい情報になかなかたどり着けず苦戦しております。 どの様に設定していけば良いか、お知恵を貸していただければ幸いです。

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

mod_rewrite を使って Listen 80 Listen 12345 UseCanonicalName Off RewriteEngine On RewriteCond %{SERVER_PORT} ^12345$ RewriteRule ^/bar$ - [PT] RewriteCond %{SERVER_PORT} ^12345$ RewriteRule .* - [F] RewriteRule ^/bar$ - [F] でどうでしょうか。 URL の読み替えを行っているわけではありませんが、 DocumentRoot が同じところを指しているなら、 読み替えないでも同じコンテンツがアクセスされます。

  • pakuti
  • ベストアンサー率50% (317/631)
回答No.2

apacheのみでは >外部からは/barリソースへは12345ポートを指定しなければアクセスできないという事ですね。 は出来ないような気がします。 それ以外の、ポート12345へのリクエストは、iptablesのForwardingを利用すれば可能です。 一般的にこのような事を実現しようとするのであればリバースプロキシーになるかと思います。 該当サーバーで、apacheをもう1つたてポート12345でリッスンし 条件によってコンテンツへのアクセスの可否を行えば出来るかもしれません。 私自身は、apacheでのProxyの構築経験が無いためなんとも言えませんが。。。。 (他のソフトの導入が可能であれば、squidやdelegate等でもOKかと)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

www.foo.net:12345/bar を www.foo.net:80/bar に読み替えると、www.foo.net/bar になりますが、それをエラーにすると結局全部エラーでは? 書いてあることが矛盾するので結局どうしたいのか不明です。 もしかすると、 「www.foo.net:12345/bar の時は /var/www/html/bar を返す。それ以外はエラ-」 と言う意味ですか?それなら単にポート12345でapacheを上げればいいだけですが。

metorontbl
質問者

補足

情報が足りずに申し訳ありません。 実にそこが肝なのですが、 www.foo.net:80/barないし、www.foo.net/bar を外部から直接リクエストした場合はエラーとし、 外部からwww.foo.net:12345/barをリクエストし、そのリクエストを内部でwww.foo.net:80/barに読み替えた場合は正常なアクセスとして処理したいという事です。 外部からは/barリソースへは12345ポートを指定しなければアクセスできないという事ですね。 >ポート12345でapacheを上げればいい 12345ポートをListernするという事でしょうか。 この時、bar以外のリソースへのリクエストは、 外部から直接標準の80ポートにアクセスされる物で、12345ポートへのアクセスはエラーとしなければいけません。 barだけ特例的に12345ポートへのアクセスを正常として扱いたいのです。 その辺りを解決できれば良いのですが。

関連するQ&A

  • IISとローカルと別サーバのTomcatを連携したい。

    サーバA上のIISから、リクエストしたURLに応じてローカルのTomcat、サーバBのTomcatにリクエストを振り分けたいと思っています。 コネクタにはisapi_redirect.dllを使用しています。 環境は下記の通りです。 【サーバA】 OS:WindowsXP JDK:1.4.2_15 Tomcat:4.1.31 IIS:5.1 【サーバB】 OS:WindowsXP JDK:1.4.2_15 Tomcat:4.1.31 IISは未使用 今回サーバAのIISをWebサーバとして使用します。 振り分けルールは下記の通りです。 1)サーバAのIISにリクエストしたURLが「/m/*」の場合はサーバAのTomcatにリクエストを送る。 2)サーバAのIISにリクエストしたURLが「/pc/*」の場合はサーバBのTomcatにリクエストを送る。 Web等を参考に設定を行いました。 その結果1)の処理は実現できましたが、別サーバにリクエストを送る2)の機能が動作しません。 駄目なパターンのURLは下記の通りです。 http://localhost/pc/login.jsp その際サーバAのTomcatを起動した際に表示される コンソール画面では、下記のメッセージが表示されていました。 2007/11/10 23:10:28 org.apache.jk.common.ChannelSocket processConnection 情報: connection timeout reached サーバA上に定義したコネクタの設定ファイル内容は下記の通りです。 (コメント部分は省略しています。) ■workers.properties default.worker=ajp13 /m/*=$(default.worker) /pc/*=ajp13second ■uriworkermap.properties worker.ajp13.type=ajp13 worker.ajp13.lbfactor=1 worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=ajp13 worker.tomcat_home=C:\Program Files\Apache Group\Tomcat 4.1 worker.java_home=C:\j2sdk1.4.2_15 ps=\ worker.list=ajp13,ajp13second worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13second.port=8009 worker.ajp13second.host=192.168.1.5 この現象を解決し、サーバBに正しくリクエストを送るにはどうすればよいのでしょうか? ご教授よろしくお願いします。

  • 特定IPだけポート変換

    CentOSでsnmpマネージャを構築しています。 CentOS機からはsnmpget/snmpwalkで外部のSNMPエージェントにsnmp requestを投げます。 ほとんどのsnmpエージェントに対しては通常のUDP161番あてに投げますが 特定のIPアドレスのsnmpエージェントに対しては別のUDPポート番号に対して投げたいのです。 iptablesを使ってDestinationポートを変換できそうな気がするのですが このような場合、iptablesをどのように書いたらよいかお教えいただけないでしょうか。 (念のため書きますと、CentOS機はFWとしてつかっているわけではありません。 snmp requestはあくまでCentOS機自身が発行するものです)

  • ApacheとTomcatの連携を、特定ポートの時だけ行いたい

    ApacheとTomcatの連携を、特定ポートの時だけ行いたい 【httpd.conf】 Include conf/vhost.conf 【vhost.conf】 Listen 5041 <VirtualHost *:5041> ServerName xxxxx DocumentRoot /var/www/myadmin </VirtualHost> Listen 5042 <VirtualHost *:5042> ServerName xxxxx DocumentRoot /var/www/labs </VirtualHost> 【proxy_ajp.conf】 ProxyPass /PG ajp://localhost:8009/PG 今現状、こんな感じになっています。 この時、  http://xxxxx/  http://xxxxx/PG/  http://xxxxx:5041/  http://xxxxx:5042/ は、動いて欲しいです。 が、  http://xxxxx:5041/PG/  http://xxxxx:5042/PG/ は動いて欲しくありません。 ApacheとTomcatの連携を、80ポートだけで行いたいのですが、 可能となる設定方法がありましたらご教示下さい。

  • 自サーバ経由の他のサーバへのリクエストを拒否したい

    自宅でサーバを運用しています。 OS:Ubuntu 11.10 Apache:2.2.20-1ubuntu1.3 昨日、access.logを見ていると、妙なリクエストがありました。 xx.xx.xx.xx - - [25/Dec/2012:10:17:30 0900] "POST http://xxxxxxxx.com/?strGet=xxxx HTTP/1.1" 200 1234 "-" "-" 普通、httpdへのGET、POST、HEADなどのリクエストは、 GET / GET /index.html GET /image/foo.jpg のように、DocumentRootからの自サーバの要素に対してのみ受け付けられると思っていたのですが、上記のように、POSTで全く別のサーバにリクエストを送信しており、コード200で正常に処理されています。 アクセス先の http://xxxxxxxx.com/ (パラメータなし)にJavascriptを切ってブラウザからアクセスしてみたら(危険な行為でしたが)、ウイルスバスターにブロックされました。 アクセス元のIPアドレス xx.xx.xx.xx は whois コマンドで調べたところ、オランダのホスティングサービスのようでした。 これは自分のサーバが何らかの踏み台にされたのでしょうか。 もしそうだとしたら、Apacheへのリクエストを、自サーバのリソースに限定する方法はないでしょうか。 GET http://foo.com/ POST http://bar.com/ などを阻止したいのです。 よろしくお願いします。

  • GETリクエストでURLを渡す時

    GETリクエストで処理対象のURLを渡し、PHPで解析しようと考えているのですが、うまくいかない場合があります。 例をあげますと下記のような場合です。 処理対象URLを解析するPHPファイル http://hogehoge.net/hoge.php?url=[渡したいURL] 処理対象URL http://hugahuga.net/?hoge=hoge&huga=huga この場合、処理対象URLに&が入っているので、解析する側のPHPで新たなパラメータと認識されてしまいます。 このような時、URLは&も含めて全てurlのパラメータとして認識させたいのですが、方法がわかりません。 ご存知の方いたらよろしくお願い致します。

    • ベストアンサー
    • PHP
  • ApacheとTomcat ポート80番について

    現在、VPSでマルチドメインで以下の2つサイトを運用しています。 1. PHPによるWordPressサイト 2. Javaによる動的サイト(静的HTML無し) Apache HTTP Server(ポート80)のバーチャルドメインを使用し、2のJavaサイトの場合はAJPでTomcat(ポート8009)へ処理を振り分けています。一般的な連携方法でと思います。 サーバーOSはCentOS5.5、IPアドレスはひとつ、ウェブサーバーにはApache HTTP Server, サーブレットコンテナとしてApache Tomcatを使用しています。root権限保持しています。 質問させていただきたいことは、Apache HTTP ServerおよびApache Tomcatを同時に起動させながらポート80番を1のサイトの場合はApache HTTPが使用、2のサイトの場合はApache Tomcatが使用できるようにする方法はご存知ないでしょうか?ということです。 現在はTomcat単独で運用する場合よりもApache HTTPを経由させるためにJavaのサイトが若干反応が遅く感じます。そもそも静的コンテンツはありませんし、URLの書き換えなども別の手段を用いているため、Apache HTTP Serverを経由する意味はどちらのサイトともブラウザでポート80番へアクセスできるようにする以外ありません。 何かよい方法ご存知ないでしょうか?なお、IPアドレスはひとつ増やしても構いません。

  • Apache→Tomcatでセッション維持されない

    Apache->Tomcatでセッションが維持されない Apacheのproxy_ajp.confの設定を ProxyPass /xxx/ ajp://localhost:8009/ とした時にhttp://サーバー名/xxx/(webapps内フォルダ名)/ でアクセスした場合アクセスする度に新しいセッションIDになってしまします。 Apacheのproxy_ajp.confの設定を ProxyPass / ajp://localhost:8009/ とした時にhttp://サーバー名/(webapps内フォルダ名)/ でアクセスした場合はセッションIDは保持されます。 http://サーバー名/でアクセスした時はTomcatのwebappsとは別の場所に配置したWebサイトを表示させている為、 【ProxyPass / ajp://localhost:8009/】とは設定したくはないんですが・・・ どうしたらよいでしょうか・・・? 今の状況 ■http://サーバー名/xxx/(webapps内フォルダ名)/  でアクセスするとセッションが保持されない。 ■Apache単体でphpを使った時、セッションは保持される。 ■8080ポートを使ってTomcatへ直接アクセスした場合、セッションは保持される。 環境 OS:CentOS 5 Apache:2.2 Tomcat:6.0

    • ベストアンサー
    • Java
  • getとpostのメソッドがごっちゃになったようなフォームの結果は、条件によって変わる?変わらない

    getとpostのメソッドがごっちゃになったようなフォームの結果は、条件によって変わる?変わらない 以下のように、getとpostのメソッドがごっちゃになったようなフォームについて質問させてください。 ==================================================================================================== <?php //なお、PHP Version 5.1.6、CentOS4.4です。 /** 以下のように、 form tagで、actionにはクエリーストリングをつけて、でもmethodとしてpostを指定した場合、 */ ?> <form action="/phpinf.php?foo=bar&fuga=hoge" method="post" name="f"> <input type="hidden" name="text_InsideFormElementWhichDeclaresExpresslyThatMethodIsPost" value="ddddd" /> <input type="submit" name="submit" value="送信" /> </form> ==================================================================================================== の結果は、 $_GETの中身(全部)は $_GET["foo"] bar $_GET["fuga"] hoge //----------------------------------------------------------- $_POSTの中身(全部)は $_POST["text_InsideFormElementWhichDeclaresExpresslyThatMethodIsPost"] ddddd $_POST["submit"] 送信 //----------------------------------------------------------- $_REQUESTの中身(全部) は、 $_REQUEST["foo"] bar $_REQUEST["fuga"] hoge $_REQUEST["text_InsideFormElementWhichDeclaresExpresslyThatMethodIsPost"] ddddd $_REQUEST["submit"] 送信 $_REQUEST["セッションidの文字列"] fdhfdshdsfhhkfdsjfdsjf //----------------------------------------------------------- また、$_SERVER から抜粋すると、 $_SERVER["REQUEST_METHOD"] POST $_SERVER["QUERY_STRING"] foo=bar&fuga=hoge $_SERVER["REQUEST_URI"] /phpinf.php?foo=bar&fuga=hoge //----------------------------------------------------------- となりました。 こういった結果は、 OS,Webサーバ,phpやperlやrubyやasp...などの言語の種類(or 素のhtml)、 また、user agent にも関係なく、 同様の結果となるのでしょうか? さらに質問ですが、こういったformの記述は、RFCやW3Cの規約に反していないのでしょうか? ご存じの方がいらっしゃしまた、お教えいただければ幸いです。 以上、よろしくお願いいたします。

  • ブログのURLとタイトルを取得したい

    ブログの記事のURLがたくさんあります。 url.txt内部に --- http://blog.jp/foo/4321.html http://site.jp/foo/bar/17167.html : ---- みたいに一行ずつ2000行ほどずらっとあるのですが、 1./がある場合はその最後の指定されたURLの/以下の部分を削除する。ない場合はそのまま。 2.削除した結果、同じURLがあったらそれを削除する 3.そのURLのタイトル(<title>タグの文字列)を取得して、URL+タイトルの形で出力する という3工程を踏んで、自分がよくいくブログのURLとブログ名がほしいです。 http://blog.jp/foo/4321.htmlならhttp://blog.jp/foo/ http://site.jp/foo/bar/17167.htmlならhttp://site.jp/foo/bar/になります。 ですがパースがうまくいかないのか同じサイトへの過剰アクセスを避けるためにsleep(1)を入れたせいかはわかりませんが、自分ではうまく成功しませんでした。 模範回答が知りたいです。このようなphpのコードをどなたかご教示ください。 どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • 回答間違い??

    class Foo{   Foo(){     System.out.println("Foo");   }   Foo(String str){     System.out.println("Foo " + str);   } } class Bar extends Foo{   Bar(String str){     Foo();  ←【ココ】     System.out.println("Bar " + str);   }   public static void main(String args[]){     Bar obj2 = new Bar("Hello");   } } あるテキストの問題で【ココ】の部分に入れる適切な処理として、super()かFoo()が正解でした・・・ しかしこのようにFoo()としてしまうとコンパイルエラーが出ます。 回答間違えだとは思うのですが、 super()以外の回答としてどのようなものがありますでしょうか? ためしにFoo.Foo()とやってみましたがだめでした・・・。 ちなみに Foo Bar Hello と出るようにします。

    • ベストアンサー
    • Java