web-dev-qa-db-ja.com

サブドメインに基づくApache動的エイリアス

私はZF1アプリケーションの一部として次の構造を持っています-

C:/www/multisite
C:/www/multisite/application
C:/www/multisite/public
C:/www/multisite/client1/uploads
C:/www/multisite/client2/uploads

私は現在、サブドメインごとに次の仮想ホストを持っています-

<VirtualHost *:80>
    DocumentRoot "C:/www/multisite/public"
    ServerName client1.multisite.dev
    Alias /uploads C:/www/multisite/client1/uploads
    FallbackResource /index.php
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/www/multisite/public"
    ServerName client2.multisite.dev
    Alias /uploads C:/www/multisite/client2/uploads
    FallbackResource /index.php
</VirtualHost>

サブドメインに基づいて動的にこれを実現したいのですが、その方法がわかりません。

{sub_domain}.multisite.dev

のエイリアスにつながります

Alias /uploads C:/www/multisite/{sub_domain}/uploads

これは可能ですか?

5
nnichols

[編集]ソリューションをテストしたので。以下に詳述するように、今では夢のように機能します。正規表現でばかげたスリップアップを作成しましたが、現在は修正されています。

アイデアは、リクエスト内のfqdnをキャプチャし、それを分割するためにRewriteCondを使用することです。正規表現はドメイン名の左端の部分をキャプチャし、%1を使用してRewriteRuleで後方参照されます。また、 'public'ディレクトリを翻訳からエスケープします。これにより、サイトにマップされたすべてのfqdn:に共通のURIパスを使用してアクセスできるようになります(テストを参照)具体例の結果)。

  • この実験の目的で、仮想ホストファイルを無効にしました。
  • 私のDNSポイントclient1.multisite.devおよびclient2.multisite.dev私のApache2.2テストサーバーに。
  • 次のスニペットは私のhttpd.confにあります。

RewriteEngine On

RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI}        !^/public/
RewriteCond ${lowercase:%{HTTP_Host}}        ^([^.]+)\.multisite\.dev$
RewriteRule ^/(.*) /myApache/runtime/docs/www/multisite/%1/$1

このディレクトリ構造を作成しました。

/myApache/runtime/docs/www/multisite/client1/uploads
/myApache/runtime/docs/www/multisite/client2/uploads
/myApache/runtime/docs/www/multisite/public

各ディレクトリには、index.htmという個別のファイルがあります。 index.htmの内容は、それが配置されているディレクトリパスを示しています。

http://client1.multisite.dev/public/index.htmORからhttp://client2.multisite.dev/public/index.htmは次の結果をもたらします:

Hi!
Served from /myApache/runtime/docs/www/multisite/public/index.htm 
See you!

http://client1.multisite.dev/uploads/index.htmにサーフィンすると、次の結果が得られます。

Hi!
Served from /myApache/runtime/docs/www/multisite/client1/uploads/index.htm 
See you!

http://client2.multisite.dev/uploads/index.htmにサーフィンすると、次の結果が得られます。

Hi!
Served from /myApache/runtime/docs/www/multisite/client2/uploads/index.htm 
See you!

また、WebブラウザーにURLを入力するときに、混合ケースをテストしました。すべてが小文字に変換されます。

ネイティブファイルシステムで大文字と小文字が区別されないWindowsでApacheを実行していることに注意してください。したがって、私は個人的に小文字のURLを見つけましたが、ブラウザーで見たほうが見た目が楽しいので、大文字と小文字を正規化する必要はありません。ただし、大文字と小文字を区別する正規化が必要なファイルシステムでは、完了のためにそれを含めます。

最後に、80以外のポートでApacheを実行すると(つまり、URLでスペルアウトする必要がある)、RewriteRuleの後方参照が壊れることにも注意しました。しかし、私はその解決策を追求しませんでした。

これがあなたが必要とするものと等しいか、十分に近いことを願っています。

6
ErikE

Mod_vhost_aliasを試してください: http://httpd.Apache.org/docs/2.2/mod/mod_vhost_alias.html 例:

<VirtualHost *:80>
    ServerName apps.mydomain.ltd
    ServerAlias *.apps.mydomain.ltd
    VirtualDocumentRoot /web/mydomain.ltd/apps/%1/public_html
    CustomLog /web/mydomain.ltd/access_Apache.log vhost_log_format
    ErrorLog /web/mydomain.ltd/logs/error_Apache.log
    ServerAdmin [email protected]    
    <Directory "/web/mydomain.ltd/apps">
        Options FollowSymLinks
        Order allow,deny
        Allow from all
        AllowOverride All
    </Directory>
</VirtualHost>
3
denis21