Apache VirtualHost内でURLをリダイレクトしますか?


61

Apacheを備えた専用サーバーがあり、その上にいくつかのVirtualHostをセットアップしました。wwwドメインとwww以外のドメインを処理するように設定しました。

wwwのVH .confファイル:

<VirtualHost *>
  DocumentRoot /var/www/site
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>

これで.htaccess

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

wwwをwww以外のバージョンにリダイレクトする簡単な方法はありますか?現在、両方のバージョンを同じものに送信してDocumentRoot使用.htaccessしていますが、VirtualHostファイルでそれを実行できる必要があります。


回答:


105

mod_rewriteVirtualHostsファイルでは、RewriteBaseルールとは別に、ルールは問題ありません。私はこれで終わった:

<VirtualHost *>
  ServerName www.example.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

編集:コメントのjoschiのアドバイスで、私は今Redirectからのディレクティブを使用してこの単純化されたバージョンを使用していmod_aliasます:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

2
これにはmod_rewriteは必要ありません。代わりにmod_aliasとそのRedirectPermanentディレクティブを使用してください。
ジョスキ

@joschi:その利点は何でしょうか?速いですか?
不機嫌なヤギ

12
クライアントをリダイレクトするだけのすべてのチェックと可能性を備えた本格的な書き換えエンジンは必要ありません。mod_aliasはmod_rewriteほど複雑ではなく、mod_rewriteで2つではなく1つのディレクティブ(RedirectPermanent)のみが必要なので、(わずかに)高速になります。そして最後になりましたが、私見では、誰かが最初にそれを見たときに設定で何が起こるかを理解するのが簡単です。
ジョスキ

1
何らかの奇妙な理由で、リダイレクト301 ..は機能しませんでした。RewriteRuleオプションを使用する必要がありました。
so_mv

注:Windows Server 2008 R2 Enterprise上のWAMPSERVER 2.0でPHP 5.3.0を使用すると、:80after VirtualHost *を含まないため、すべてが「禁止」を返します。
シーズティマーマン14

4

301リダイレクトには非常に注意してください。デフォルトでは、301リダイレクトを受信するブラウザは永続的に保存するため、ドメインにアクセスしようとしたときにブラウザが表示するものを制御できなくなりますwww.example.com

たとえば、この議論を参照してくださいhttp://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

そのため、キャッシュされないことを確認するか、mod_proxyを使用します(mod_proxyをお勧めします)。

ブラウザのアドレスバーでURLの変更をユーザーに確認しても問題ない場合は、mod_rewriteを使用します。

<VirtualHost *>
 ServerName www.example.com
 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^www.example.com
 RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
 Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
 Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>

「リダイレクト」をユーザーから見えないようにするには、mod_proxyを使用します。

<VirtualHost *>
 ServerName www.example.com
 ProxyRequests Off
 <Proxy *>
 Order Deny,Allow
 Deny from all
 Allow from 203.0.113.67
 </Proxy>
 ProxyPass / http://example.com/
 ProxyPassReverse / http://example.com/
</VirtualHost>

mod_proxyは、適切に構成されていない場合、ネットワークに悪影響を与える可能性があることに注意してください。


5
301のポイントは、永続的なリダイレクトであることです。非永続的なリダイレクトが必要な場合は、代わりに302または307を使用する必要があります。
ニックグリム

2

あなたは追加することができますServerAlias example.comへのVirtualHostパフォーマンスは、リダイレクトとは異なります。

編集

リダイレクトする必要があり、高度な機能は必要ないため、使用Redirectするだけで十分なようです。RedirectVirtualHostディレクティブの下に配置します。

クライアント側の解決策は、meta refreshタグを使用することです。


もう少し説明してもらえますか?この方法www.example.comexample.com使用するにはどのようにリダイレクトしますか?
不機嫌なヤギ

プライマリのバーチャルホストでは、両方のエントリを持っているServerNameServerAlias。一方にはexample.comがあり、もう一方にはwww.example.comがあります。次に、両方のdnsエントリが同じvhostで指定されたドキュメントにアクセスします。
ワーナー

エイリアスだけでなく、リダイレクトもしたいです。
不機嫌なヤギ

それからjoshchiの推薦はあなたのためのよいアプローチかもしれません。この時点で毛が分割されているようです。
ワーナー

1

SERVERNAME www.example.comに1つの仮想ホストを作成し、servername example.comの別の仮想ホストにリダイレクトさせることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.