サブドメインにmod_rewriteを使用する
-
06-07-2019 - |
質問
自分のセクションを自分のサイト内に登録できず、それらのセクションを自分のサイトのサブドメインにすることはできません。だから、誰かが「test」を登録して、「test.example.com」に自分のサイトを参照させることができます。たとえば、/ site.php?id = 1になります。では、このためにmod_rewriteルールを書きますか?
解決
mod_rewrite
はこれに最適なツールではないかもしれません。 RewriteRulesは、ファイルを他の何かにマッピングするのに最適ですが、ドメインマッチングを目的としたものではありませんでした。
mod_rewrite
を使用してできることは次のとおりです。
RewriteEngine On
# Skip www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L]
これはあまり役に立ちません。プログラムで HTTP_HOST
の値をプログラムで確認する場合は、代わりに行うことをお勧めします:
function get_subdomain() {
if(preg_match('/^([^.]+)\.domain\.com/i', mod_rewrite
はこれに最適なツールではないかもしれません。 RewriteRulesは、ファイルを他の何かにマッピングするのに最適ですが、ドメインマッチングを目的としたものではありませんでした。
mod_rewrite
を使用してできることは次のとおりです。
RewriteEngine On
# Skip www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L]
これはあまり役に立ちません。プログラムで HTTP_HOST
の値をプログラムで確認する場合は、代わりに行うことをお勧めします:
<*>SERVER['HTTP_HOST'], $matches))
return $matches[1];
}
他のヒント
「特別」を要求するようにApacheを設定できます。仮想ホストコンテナ内のApache構成(例:www.mydomain.comなど)のドメイン、および他のドメインは最初の仮想ホストにデフォルト設定されます。次に、ベースURLをディスパッチアプリケーションに書き換えて、URLを検査し、ユーザーを正しい領域に送ります。
Apache 2.0ドキュメントから:
ほとんどすべてのApacheディレクティブを使用できます VirtualHostコンテナーに。の 最初のVirtualHostセクションは 既知のサーバー名のないリクエスト。
最初の仮想ホストで* .mydomain.comを処理するコードを追加します。
<VirtualHost *:80>
Servername custom.mydomain.com
DocumentRoot /var/www/html/custom
RewriteEngine on
RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R]
# more configs here
</VirtualHost>
<VirtualHost *:80>
Servername www.mydomain.com
DocumentRoot /var/www/html/homepage
# more configs here
</VirtualHost>
dispatch.cgiで、呼び出し元のURLを調べて、ユーザーがどこに行くべきかを判断します。すべてのサブドメインを受け入れるようにDNSを設定してください。
役立つことを願っています!
実際、私たちはこの1年間、この手法を問題なく使用してきました。 mod_rewriteの構成は次のようになります。
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !www.mydomain.com
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com
RewriteCond %{REQUEST_URI} !admin
RewriteRule (.*) /admin/ [R=301,L]
RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L]
何が起こるかというと、ユーザーはaccount.mydomain.com/adminにリダイレクトされます。
次に、PHPを使用して、ドメイン名のアカウント部分を識別します。 $ _SERVER ['SERVER_NAME']のようなものを使用するか、ドメイン名を取得して解析する何らかの方法を使用すると、非常にうまく機能します。
これらの構成をhttpd.confに保持します。これは、.htaccessのままにしておくと、トラフィックの多いサイトでCPUの問題になります。