web-dev-qa-db-ja.com

内部サーバーへのApache RewriteまたはProxy

まず最初に、これはApacheでの最初の試みなので、私の初心性を許してください:)

基本的な設定は次のとおりです。mysub.domain.comは、godaddyのDNSマネージャーのCNAMEエントリを介して静的IPに送信されます。 Apache2を実行している私のUbuntu 10 LTSサーバーにヒットします。

そのリクエストを適切な/var/www/mysubフォルダに転送する仮想ホストエントリがあります。そこにはコンテンツはありませんが、「It Works」ページに行を追加したので、そこに正常に到達したかどうかがわかります。また、Ubuntuサーバーと同じローカルネットワークでWikiサーバーを実行しているMac Miniも持っています。

mysub.domain.comフォルダの代わりに/var/www/mysubをミニサーバーにヒットさせたいです。

このサイトや他のサイトで多くの記事を読んだ後、なんとかそれを行うことができました...

私の/var/www/mysub/.htacessには、別のSFの質問で見つけた次の情報があります(リンクをコピーするのを忘れました)。

RewriteEngine on
RewriteCond %{HTTP_Host} ^mysub.domain.com/*
RewriteRule .* http://192.168.x.x/ [P,L]

mysub.domain.comをMiniのフロントページにリダイレクトするので、これは不必要に機能します。しかし、もちろん、それ以降のすべてのリンクはミニページをクリックします。私はそれがなぜそうしているのか理解していると思います(mysub.domain.comで始まるものは、基本的にWikiサーバーのフロントページに向けられます。Wikiサーバー上の後続のリンクにもmysub.domain.comが含まれているため、常に同じ場所で終わる)

どうしたらいいのかわからない。正直に言うと、実際にはそれらのRewrite行の構文を理解していません。


私は無数の構成エントリの例を見て、それらのいくつかを試しましたが、構文を本当に理解していないと、それは一種の暗闇の中での撮影です。

This は便利な投稿でした this の質問を読んだ後、これを/Apache2/httpd.confファイルに追加してみました

<Location />
   ProxyPass http://192.168.x.x
   ProxyPassReverse http://192.168.x.x
</Location>

運が悪い。

明らかに、私はいくつかのことを学ぶ必要がありますが、私がしたいことはおそらく非常に単純であるように思えます。何が欠けていますか?


コメントごとの編集

私の/etc/Apache2/httpd.confファイル

ServerName localhost

<VirtualHost *:80>
   ServerName domain.com
   ServerAlias www.domain.com
   DocumentRoot /var/www/domain
</VirtualHost>

<VirtualHost *:80>
   ServerName mysub.domain.com
   DocumentRoot /var/www/mysub
   <Location />
      ProxyPass http://192.168.x.x/
      ProxyPassReverse http://192.168.x.x/
   </Location>
</VirtualHost>

...と私のsites-available/mysubファイル...

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName mysub.domain.com
        DocumentRoot /var/www/mysub

        #ProxyRequests Off
        <Location />
                ProxyPass http://192.168.1.50/
                ProxyPassReverse http://192.168.1.50/
        </Location>
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/mysub>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/www/mysub/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/Apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

Apache2ctl -Sの出力

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server 66-152-109-110.tvc-ip.com (/etc/Apache2/sites-enabled/000-default:1)
         port 80 namevhost 66-152-109-110.tvc-ip.com (/etc/Apache2/sites-enabled/000-default:1)
         port 80 namevhost domain.com (/etc/Apache2/sites-enabled/domain:1)
         port 80 namevhost mysub.domain.com (/etc/Apache2/sites-enabled/mysub:1)
Syntax OK
3
JoshP

あなたはとても近いです!

いくつかのメモ:

  • RewriteCond %{HTTP_Host} ^mysub.domain.com/*-HTTP_Host変数にはmysub.domain.comのみが含まれ、残りのパスは含まれません。

    このルールは実際には一致しますが、偶然です。/文字はありませんが、*修飾子は/文字に適用されます。これは、「/ 0を無限回繰り返す」ことを意味します。

    ApacheはPerl互換の正規表現を使用します。正確なホストに一致させるには、次のようにします。

    RewriteCond %{HTTP_Host} ^mysub\.domain\.com$
    
  • RewriteRule .* http://192.168.x.x/ [P,L]-渡されたパスの残りを含まないため、これはホームページのみをロードしています-RewriteRule[P]フラグを使用する場合は、手動で行う必要があります。

    これはうまくいくはずです:

    RewriteRule (.*) http://192.168.x.x/$1 [P,L]
    
  • ProxyPassの設定はほぼ正しいですが、.htaccessファイルの設定によって上書きされるため、使用されません。 .htaccessを使用すると、パフォーマンスが低下し、セキュリティの問題が発生する可能性があります。Apacheのドキュメントの推奨事項 here を参照してください。

    おそらく、最善の方法は、.htaccessファイルを完全に削除し、ProxyPassを使用することです。設定を少し変更してください...

    <Location />
       ProxyPass http://192.168.x.x/
       ProxyPassReverse http://192.168.x.x/
    </Location>
    

    ...そして、それをhttpd.confからサブドメインにサービスを提供している<VirtualHost>ブロック内に移動します。

    末尾のスラッシュが一致し、.htaccessがなくなるため、これでうまくいくはずです。

3
Shane Madden

これがパズルの最後のピースでした。 this の質問の答えとしてそれを見つけました。

解決策は、これを/etc/Apache2/mods-enabled/proxy.conf

<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy *>
  AddDefaultCharset off 
  Order deny,allow
  Allow from all 
</Proxy>
0
JoshP