ここで何が問題なのですか?
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.apples.co.uk
DocumentRoot /var/www/apples.co.uk
RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.apples\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.apples.co.uk/$1 [L,R=301]
</VirtualHost>
<VirtualHost *:80>
ServerName www.bananas.co.uk
DocumentRoot /var/www/bananas.co.uk
RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.bananas\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.bananas.co.uk/$1 [L,R=301]
</VirtualHost>
問題:
apples.co.uk
はwww.apples.co.uk
に正しくリダイレクトしますが、bananas.co.uk
はwww.apples.co.uk
にリダイレクトします。
apples.co.uk
またはbananas.co.uk
のいずれかがリダイレクトされると、アドレスバーはhttp://www.apples.co.uk//
になります。最後に余分なスラッシュの原因は何ですか?
ここでapachectl -S
の出力:
[Sun Jul 31 08:41:52 2011] [warn] NameVirtualHost *:80 has no VirtualHosts
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 is a NameVirtualHost
default server www.apples.co.uk (/etc/Apache2/httpd.conf:3)
port 80 namevhost www.apples.co.uk (/etc/Apache2/httpd.conf:3)
port 80 namevhost www.bananas.co.uk (/etc/Apache2/httpd.conf:11)
port 80 namevhost servername.apples.co.uk (/etc/Apache2/sites-enabled/000-default:1)
Syntax OK
最初の問題はdefault server
設定が原因であると思います。どうすれば削除できますか?デフォルトが必要ですか?
警告を取り除くためにsites-enabled
に追加する必要があることも知っていますが、別の質問にそれを残します。
最初:
最初に定義されたVirtualHostは、不明なドメイン名のキャッチオールとして使用されます。
Apacheはapples.co.uk
を認識しません-www.apples.co.uk
のみを認識します。そのため、最初の仮想ホストを使用してapples.co.uk
を提供します。ここでリダイレクトは正常に機能します。
Apacheはbananas.co.uk
を認識しません-www.bananas.co.uk
のみを認識します。そのため、最初の仮想ホストを使用してbananas.co.uk
..(www.apples.co.uk
)を提供します。したがって、www.apples.co.uk
にリダイレクトされます。
上記の問題を解決するには:最初の仮想ホスト内にServerAlias apples.co.uk
行を追加し、2番目にServerAlias bananas.co.uk
行を追加します。任意のサブドメインもキャッチしたい場合は、次の行も追加してください:ServerAlias *.apples.co.uk
(bananas.co.uk
でも同じ)。
SECOND:
RewriteRule
URLには、サーバー構成/仮想ホストコンテキストで宣言されている場合、先頭にスラッシュが含まれます。この書き換えルールが.htaccessで宣言されている場合は正常に機能しますが、ここでは(VirtualHost宣言内で)ドメイン名の後にスラッシュを削除する必要があります in RewriteRule
ターゲット。そのため、リダイレクト時にドメイン名の後にダブルスラッシュが付きます。
比較的高価な正規表現を単純な文字列比較で置き換えることで、ホストのビット一致を高速化することもできます:!^www\.bananas\.co\.uk$
=> !=www.bananas.co.uk
。
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.apples.co.uk
ServerAlias apples.co.uk
DocumentRoot /var/www/apples.co.uk
RewriteEngine On
RewriteCond %{HTTP_Host} !=www.apples.co.uk [NC]
RewriteRule ^(.*)$ http://www.apples.co.uk$1 [L,R=301]
</VirtualHost>
<VirtualHost *:80>
ServerName www.bananas.co.uk
ServerAlias bananas.co.uk
ServerAlias *.bananas.co.uk
DocumentRoot /var/www/bananas.co.uk
RewriteEngine On
RewriteCond %{HTTP_Host} !=www.bananas.co.uk [NC]
RewriteRule ^(.*)$ http://www.bananas.co.uk$1 [L,R=301]
</VirtualHost>
最初の問題はデフォルトのサーバー設定が原因だと思います。どうすれば削除できますか?デフォルトが必要ですか?
何らかの偽のドメイン名のVirtualHostを作成し、最初に(他の<VirtualHost>
宣言の前に)配置します。そのような未知のドメイン名が要求されると、Apacheのエラーページが表示されます。