.htaccessで非wwwをwwwにリダイレクトする


188

私の.htaccessファイルにこれがあります:

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

しかし、ルートにあるファイルにアクセスするhttp://example.com/robots.txtと、にリダイレクトされhttp://www.example.comrobots.txt/ます。

これを修正して、正しくリダイレ​​クトされるようにするにはどうすればよいhttp://www.example.com/robots.txtですか?

回答:


388

設定を次のように変更します(スラッシュを追加):

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

または、以下に概説されているソリューション(@absiddiqueLiveによって提案)は、どのドメインでも機能します。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

httpとhttpsをサポートし、プロトコルの選択を維持する必要がある場合は、以下を試してください。

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

を置き換える場所logincheckout.phpまたはHTTPSをサポートするために必要なURL。

これは悪い考えですが。理由については、この答えを読んでください


このソリューションは、一部のページ(ログインやサインアップなど)がhttpsプロトコルを使用している場合は機能しません。
Alexey Kosov 2014年

一部の情報を含めるために、投稿を少し更新しました。使用するプロトコルを包括的かつ正確に選択することは困難です。
ランドールハント

2
最初のソリューションでは十分にリダイレクトされず、2番目のソリューションではリダイレクトが多すぎるようです。たとえば、次のようにblog.example.comなりますwww.blog.example.com
gman

localhostで開発中にリダイレクトを回避する方法も追加していただけませんか?
Bugs Bunny

私はここですべてをフォローしていますが、何も機能していません。私はlaravelセットアップを使用しています。なぜこれが私にとってうまくいかないのか誰か誰か知っていますか?www.domain.comとdomain.comはどちらも正しく読み込まれますが、domain.comはwww.domain.comにリダイレクトしません。これは私のDNSの問題でしょうか?
hello world

92

httpsとhttpをサポートする正しいソリューションは次のとおりです。

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

7
これは完璧wwwです。また、他の一般的なソリューションのようにサブドメインをリダイレクトしません。
Fabian Schmengler、2015

4
これは最良の解決策であり、受け入れられた回答よりもはるかにうまく機能し、HTTPSを適切に処理します
Tamik Soziev

3
完璧に動作します!そして、そのような数行で!
zeckdude、2015年

7
これがベストアンサーです
Andrew

7
私が間違っていなければ、これは複数のドットでは機能しません。例:yoursite.co.uk
TrashyMcTrash

82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Httpsの場合

RewriteCond %{HTTPS}s ^on(s)|

RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]

7
このソリューションは、すべてのドメインで機能するため、@ ranmanよりも優先されるため、新しいプロジェクトのコードを実装するとき、または既存のプロジェクトに追加のドメインを実装するときの人的エラーを最小限に抑えます。
フランキー

私はこの解決策を好みますが、なぜ^(.*)$代わりに(.*)
Popnoodles 2014

この解決策はより良いですが、私もあなたのものを含むように私を編集しました。
Randall Hunt、

1
これはすべてのドメインで機能し、シンプルで効果的です。ありがとう
eirenaios 2015年

RewriteCond%{HTTPS} s ^ on(s)|をフォローできます| RewriteRule ^ http%1://www.% {HTTP_HOST} / $ 1 [R = 301、L]
absiddiqueLive

23

次の例は、sslnon-sslの両方で機能し、1つのルールだけを使用してhttpとhttpsを管理するため、はるかに高速です。

RewriteEngine on


RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s on(s)|offs()
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

[テスト済み]

これはリダイレクトされます

http

https


1
私が思いついたものに非常に近い。"mysite.co.uk"のように、HTTPホストで複数のドットもサポートします。
アダムビーン2016

2
好奇心から、ここでR = 301を使用しないのはなぜですか?コードが指定されていない場合、デフォルトで302(moved temp。)を使用します。
2016

1
完璧に動作します。これは受け入れられる答えになるはずです。
James Nisbet

8

これを試して、私は多くのウェブサイトで使用しました、それは完全に機能します

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]

4

私は上記のすべてのソリューションをテストしましたが、うまくいきませんでした。http://を削除しようとしましたが、リダイレクトしないので、wwwもうまくリダイレ​​クトされます。 ://

だから私はいくつかのコードを組み合わせて、http://とhttps://とwwwとwww以外の両方の完璧なソリューションを考え出しました。

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

これが誰かを助けることができることを願っています:)



3

この構成は、SSLが構成されたbitnami wordpressで私のために機能しました:

ファイル/opt/bitnami/apps/wordpress/conf/httpd-app.confの「RewriteEngine On」の下に以下を追加しました

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

これにより、WWWで開始されていないドメインがリダイレクトされます。すべてのサブドメインはリダイレクトされません。

それは便利です。


2

一番上の回答はwww以外をwwwに正常にリダイレクトすると信じていますが(例:mysite.com-> www.mysite.com)、ワイルドカードサブドメインは考慮されないため、次のような結果になります。

random.mysite.com -> www.random.mysite.com

HTTPSあり/なしのソリューションは次のとおりです

HTTP

RewriteEngine On

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ http%{ENV:protossl}://www.mysite.com/$1 [L,R=301] 

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ %{ENV:protocol}://www.mysite.com/$1 [L,R=301]

*注:現在テストする証明書がないため、httpsはテストしていませんが、誰かが私が持っているものを検証または最適化できればそれはすばらしいでしょう。


最初の$はここで何をしますか: '^(。*)$'
Vaishal Patel

0

可能であれば、これをメインのApache構成ファイルに追加します。これはより軽量なソリューションであり、必要な処理が少なくなります。

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin me@example.com
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

そのVirtualHostため、「example.com」の個別はそれらのリクエストをキャプチャし、それらをメインに永続的にリダイレクトしますVirtualHost。そのため、すべてのリクエストでREGEX解析を行う必要はなく、クライアントブラウザはリダイレクトをキャッシュするため、「間違った」URLを再度リクエストすることはなく、サーバーの負荷を軽減できます。

の末尾のスラッシュに注意してくださいRedirect permanent / http://www.example.com/。それがなければ、からのexample.com/asdfリダイレクトはのhttp://www.example.comasdf代わりににリダイレクトされますhttp://www.example.com/asdf


0

2つの警告

301を避け、最新の303または307応答ステータスコードを優先します。

301を避ける

次のように示される永続的なリダイレクトが本当に必要かどうかを慎重に検討してください [R=301]後で変更するた場合、ページの以前の訪問者は元のリダイレクトのページを引き続き表示するためです。

永続的なリダイレクト情報は、ブラウザのキャッシュに頻繁に格納され、一般に、排除することは困難です(ページを再ロードしても問題は解決しません)。あなたのウェブサイト訪問者は以前のリダイレクトで「永遠に」止まります。

302も避ける

HTTPプロトコルの新しいバージョン(v1.1)では、302の代わりに使用できる2つの新しい応答ステータスコードが追加されました。

  • 303 URLリダイレクションですが、リクエストのタイプをGETに変更するよう要求しています。
  • 307 URLリダイレクトですが、最初に送信されたときの要求のタイプを維持することを要求します。

302あいまいと見なされても、コードを使用できます(非永続的なリダイレクト)。いずれにせよ、ほとんどのブラウザ302は新しい303コードが指示するのと同じ方法で実装します。


301に関する警告については、同じドメイン名について話していてもこれは当てはまりますか?これがこの場合にどのように適用されるかはわかりません...すべてのURLをからhttp://example.com/testingにリダイレクトしますhttp://www.example.com/testing。長期的には悪いアプローチかもしれませんか?ありがとう、
Sara_

-1

.htaccessに書き込みます:)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

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