Apacheは、単一の<場所>を介して複数のディレクトリサービスを提供してみましょう

StackOverflow https://stackoverflow.com/questions/668150

  •  21-08-2019
  •  | 
  •  

質問

私は、仮想ホストを大量に提供し、物事のより効率的な方法があれば、私は思っていたとの問題を持っています。

私は現在、合計で19個の部門からの300件の以上のプロジェクトを、さまざまな部門から大量のプロジェクトを提供するためにLocationディレクティブを使用しています。構造は、ファイルから提供されているディレクトリを除く、すべてのLocationディレクティブでも同じです。私が現在持っていることは、このようになり、大きなファイルです。

<VirtualHost *> 
   ServerName www.myserver.com 

   <Location /departmentA/project1> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project1/passwords 
      Require valid-user 
   </Location> 

   <Location /departmentA/project2> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project2/passwords 
      Require valid-user 
   </Location> 

   <Location /departmentB/project1> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project1/passwords 
      Require valid-user 
   </Location> 
</VirtualHost>

あなたはすべてのこれらの構造はパス以外は同じです見ることができるように。私が希望することはもちろん、私は、部門やプロジェクト名に変数を使用し、1つだけのLocationディレクティブを維持することができるものです。私は、これは、サーバーとメモリ上でもあまり重いと仮定します。

<VirtualHost *> 
   ServerName www.myserver.com 

   <Location /$1/$2> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/$1/$2/passwords 
      Require valid-user 
   </Location> 
</VirtualHost>
役に立ちましたか?

解決

私はAuthUserFileが動的引数を受け入れないと思うと、

私は、特にそれを行うにはどのような方法を知りません。それは<Location>ブロックのテンプレートを取り、あなたが保護したい各ディレクトリのためにそれを繰り返し選択した言語で小さなスクリプトを記述するのが最も簡単かもしれません。例、Pythonでます:

#!/usr/bin/python
import sys
print '<VirtualHost *:80>'
print '   ServerName www.myserver.com'
for path in sys.stdin:
    print '   <Location /%s>' % path.strip()
    print '      AuthType Basic'
    print '      AuthName "By Invitation Only"'
    print '      AuthUserFile /usr/local/%s/passwords' % path.strip()
    print '      Require valid-user'
    print '   </Location>'
print '</VirtualHost>'

は、それが標準入力に読み出しフォーム「departmentA / Project1の」の各ラインについて、それが対応する<Location>セクションを出力します。

他のヒント

あなたは <のLocationMatch>ディレクティブを試したことがありますか?

これは、代わりに、パスの正規表現になります。あなたのパスとその関連するサブオプションに応じて、あなたがそれらのより扱いやすい一握りまでディレクティブの数百を減らすことができる場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top