web-dev-qa-db-ja.com

このvhostのApache httpd.confファイルの何が問題になっていますか?

ここで何が問題なのですか?

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.ukwww.apples.co.ukに正しくリダイレ​​クトしますが、bananas.co.ukwww.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に追加する必要があることも知っていますが、別の質問にそれを残します。

2
paradroid

最初:

  1. 最初に定義されたVirtualHostは、不明なドメイン名のキャッチオールとして使用されます。

  2. Apacheはapples.co.ukを認識しません-www.apples.co.ukのみを認識します。そのため、最初の仮想ホストを使用してapples.co.ukを提供します。ここでリダイレクトは正常に機能します。

  3. 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.ukbananas.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のエラーページが表示されます。

6
LazyOne