非wwwからwwwへのApacheリダイレクト


206

www以外からwwwにリダイレクトされないように見えるWebサイトがあります。

私のApache設定は次のとおりです。

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

何が欠けていますか?


1
以下の場合.htaccess:ベースのソリューション私は、直径質問に提起されてきた答えは示唆stackoverflow.com/a/5262044/367456
hakre

これは良いですが、URLにスラッシュを追加するので、ドルの前にスラッシュを失います。
wuxmedia

回答:


510

この問題を解決するには、書き換えエンジンを使用するのがかなり重い方法です。これはより簡単な解決策です:

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

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

そして、実際のサーバー構成用の<VirtualHost>セクションがもう1つありServerName www.example.comます。Apache /は、Redirectディレクティブを使用した後、自動的に何も保存します。これは、このメソッドが機能しない理由(実際には機能する)に関する一般的な誤解です。


20
ssl仮想ホストもあるサイトでそれをどのように行いますか?
Shabbyrobe 2010

28
この提案を使用すると、「example.comのウェブページでリダイレクトが多すぎます」というエラーが表示されます。他にこの問題がありますか?
ジョナサンバーガー

4
@BlackDivine:他の方向にそれを行うことについて魔法はありません。単純に入れ替えるwww.exampleexample、彼らはサンプルに表示されますどこ。
グレッグヒューギル

11
@JonathanBergerリダイレクトが多すぎる場合は、ファイルを適切に構成していない可能性があります。2つのVirtualHostsがあることを確認してください。1つは上記の非wwwを使用し、もう1つは実際の構成を持つServerName www.example.comを使用します。また、www.example.com構成(mod_aliasとmod_rewriteの両方)にもリダイレクトがないことを確認してください。
Savas Vedova 2013

3
たとえば、example.comのような仮想ホストサーバーのRedirect 301 / http://example2.com/extra/場合、リダイレクトすると、末尾のスラッシュexample.com/blahが失われexample2.com/extrablahます。つまり、に移動します。何か案は?(Apache 2.2.22)
Peter Howe

87

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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

3
非常に短い答え...しかし要点...これが賛成票か反対票かは
不明

2
すごいですね、これはトップレベルのサーバー設定に含めることができます(そうであれば)すべての仮想ホストに適用されます!
thenickdude 2014

こんにちは@burzumkoこれをどのように達成しますか?これはwwwなしのすべてに当てはまりますが、次に、example.com/subdi1/ws/* wwwなしで通過するようにしますか?
黒の先生

1
私はこのソリューションをHTTPS仮想ホストにも使用しました。s3行目のhttpにを追加するだけです。
rodrigoap 2017

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

これは私にはうまくいきませんでした。同じサイトへの無限リダイレクトループが発生しました
dmiller309

1
@ dmiller309:に含まwww.れていServerAliasますか?
cherouvim 2014年

2
あなたが正しい、私は誤ってwwwを入れました。*を使用してServerAliasで。ワイルドカード。VirtualHostエントリの順序を乱したため、*。ワイルドカードは、思いもよらなかったときに一致する機会がありました。
dmiller309 2014年

7
クリーンでパスを維持し(回答#1とは異なり)、Rewriteを使用しないため、これが最良の回答です。
schieferstapel 2015年

30

ウェブサイトwwwから削除するにURLは、.htaccessファイルで次のコードを使用します。

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

wwwあなたのウェブサイトを強制するには、URLこのコードを使用してください.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

どこYourSite.comに置き換える必要がありますURL


ここでのベストアンサーは、複数のドメイン名を持つWebサイトで機能する<3
Clement Herreman、2012

2
.htmlの2番目の部分は何ですか?
Nathan H

6
リダイレクト後にダブルスラッシュ(//)が含まれないように$ 1の前のスラッシュを削除=> RewriteRule ^(。*)$ yourSite.com $ 1 [R = 301]
Kevin Campion

22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

これが上記のコードで起こることです。最初の仮想ホストブロックは、リクエストがwww.example.comかどうかをチェックし、そのディレクトリでWebサイトを実行します。

失敗すると、2番目の仮想ホストセクションになります。ここでは、www.example.com以外はすべてwww.example.comにリダイレクトされます。

ここでの順序は重要です。最初に2番目のvirtualhostディレクティブを追加すると、リダイレクトループが発生します。

このソリューションは、ドメインへの要求をwww.yourdomain.comにリダイレクトします。

乾杯!


16

これは、いくつかの機能が強化された他の多くの提案と同様です。

  • ドメインをハードコーディングする必要はありません(複数のドメインまたは環境間を受け入れるvhostsで動作します)
  • スキーム(http / https)を保持し、以前の%{REQUEST_URI}ルールの影響を無視します。
  • パス部分は以前RewriteRuleのような影響を受けません%{REQUEST_URI}

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

4
ほぼ完璧です。%{HTTP_HOST} / $ 1ではなく%{HTTP_HOST} $ 1でなければなりません(または、スラッシュが2倍になります)
Michael Wyraz

@Michael Wyraz:ここでスラッシュを2倍にしないのですか?
not2savvy

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

これHTTP_HOSTは、着信URL(example.com)のドメイン名部分のみを含む変数から始まります。ドメイン名にaが含まれておらず、ドメイン名www.と完全に一致すると仮定すると、RewriteRuleが機能します。パターン^(.*)$REQUEST_URI、HTTPリクエスト(foo/blah/index.html)でリクエストされたリソースであるのすべてに一致します。これは後方参照に保存され、新しいドメイン名(で始まるものwww)でURLを書き換えるために使用されます。

[NC] 大文字と小文字を区別しないパターンマッチングを示します。 [R=301]示し、コード301(リソースが永続的に移動される)を使用した外部リダイレクトを示し、[L]それ以降のすべての書き換えを停止し、すぐにリダイレクトします。


6

www以外の=> wwwと反対のwww => www以外の両方のリダイレクトコード。.htaccessファイルにドメインとスキームをハードコーディングしていません。したがって、元のドメインとhttp / httpsバージョンは保持されます。

APACHE 2.4以降

非WWW => WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => NON-WWW:

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

注:%{REQUEST_SCHEME}が利用できないApache 2.2では動作しません。Apache 2.2との互換性のために、以下のコードを使用するか、%{REQUEST_SCHEME}を固定のhttp / httpsに置き換えてください。


APACHE 2.2以降

非WWW => WWW:

RewriteEngine On

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

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

...またはより短いバージョン...

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

WWW => NON-WWW:

RewriteEngine On

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

...%Nは最後のRewriteCondからしか使用できないため、短いバージョンは使用できません...


Apache 2.4 configが問題を修正しました。明確な回答に感謝します。
キムチマン

5

私はこれを実行しました...

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

これは、新しいサーバーの25以上のドメインで共通にする必要があるため、このディレクティブは<Directory>タグのvirtual.confファイルにあります。(dirはすべてのdocrootの親です)

しかし、http://httpd.apache.org/docs/2.2/mod/mod_rewrite.htmlが言っていることにもかかわらず、完全なdocrootがパターンマッチで実行されていたので、書き換えルールを少しハックする必要がありました。ホストとポートの後にのみ存在することについて。


5

Apache 2.4を使用している場合は、書き換えapacheモジュールを有効にする必要がなく、次のようなものを使用できます。

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

1
過小評価された答え。これを使用すると、追加のvhostを回避できます。これは、自動Let'sEncryptスクリプトに適しています。
ポール

プラス、あなたはANSIBLE 2.0以降、ANSIBLEを使用している場合、あなたは簡単にここで詳細は、一つのタスク内のファイルにブロックを挿入することができdocs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n

3

domain.tldをwwwにリダイレクトします。

次の行は、Apacheディレクティブまたは.htaccessファイルに追加できます。

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 他のsudomainはまだ機能しています。
  • ラインを調整する必要はありません。コピーして、適切な場所に貼り付けてください。

仮想ホストを変更する場合は、Apacheの変更を適用することを忘れないでください。

(デフォルトのDrupal7 .htaccessに基づいていますが、多くの場合動作するはずです)


3

これは簡単です!

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

2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

これは、ドメイン名だけでなく、内側pages.likeないだけをリダイレクトします...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh


これをありがとう。非常に役立ちます。
Anthony

2

これを試して:

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

2

常に使用しないでくださいRedirect permanent(または将来的に問題が発生する理由)

後でサブドメインを追加する可能性がある場合は、使用しないでください redirect permanent

クライアントが登録されていないサブドメインを使用した場合、VirtualHost後で登録されても、このサブドメインに到達できない可能性があるためです。

redirect permanent を送信します HTTP 301 Moved Permanentlyクライアント(ブラウザ)にそれらの多くはこの応答を永遠にキャッシュします(キャッシュが[手動で]クリアされるまで)。したがって、そのサブドメインを使用すると、サーバーを再度要求することなく、常にwww。***に自動リダイレクトされます。

ブラウザがHTTP 301をキャッシュする期間を参照してください

だから使うだけ Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org-mod_rewriteを使用しない場合

Apache.org-正規のホスト名


1

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

この完璧な作品をチェック


0

私は同じ問題を抱えています。しかし、これで解決しました

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

このルールは、www以外をwwwにリダイレクトします。

そして、wwwを非wwwにリダイレクトするこのルール

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

http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/から参照してください


0

これは私にとってはうまくいきます:

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

Apacheで無限リダイレクトループを回避するために、すべてのドメインをサブドメインにリダイレクトするときに(?!www.domain.com)、先読みパターンを使用してwwwサブドメインを除外しますwww


0

私が使用するコードは次のとおりです。

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

0

-複数のドメイン名をホストしている場合(オプション)

-それらすべてのドメイン名がhttpsを使用している場合(必要に応じて)

-すべてのドメイン名でwww dot domainNameを使用する場合

これにより、ダブルリダイレクトが回避されます(http:// non wwwからhttp:// wwwへ、次にhttps:// wwwへ)。

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

そして

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

リダイレクトコード301を最も便利なものに変更する必要があります


-1

上記の<VirtualHost *:80>異なる2つのブロックのソリューションを使用する場合ServerName...

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

...次に、同様に設定NameVirtualHost Onする必要あります

これを行わないと、ApacheはServerNameブロックを区別するために異なるを使用することを許可しないため、次のエラーメッセージが表示されます。

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

...そしてリダイレクトが発生しないか、最初に配置したブロックに応じて無限のリダイレクトループが発生します。


-1

私はWPマルチサイトで同様のタスクを持っていましたが、リダイレクトルールは一般的なものでなければなりませんでした(ネットワークに追加する特定のドメインに対して)。私は最初にドメイン(パーキングドメイン)にワイルドカードを追加することを解決しました。に注意してください。.comの後。

CNAME * domain.com.

次に、マルチサイトのルートにある.htaccessファイルに次の行を追加しました。それはどんなサイトでもうまくいくと思います。

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

うまくいけば、これが役立ちます。

ps。www以外からwwwにリダイレクトする場合は、最後の行を

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

-2

複数の仮想ホストを使用する場合は、ServerAliasを使用する方が簡単(かつ便利)です。

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

これはhttps vhostsでも機能します。


別のドライブバイ反対投票。説明に気をつけて、ダウン投票を説明するのに悩むことができなかったhttpdの強大な神よ?
アンソニー

1
これにより、同じサイトをホストする複数のドメインが作成されます。状況と基盤となるWebサーバーが実行しているものに応じて、Cookieが引き継がれない、ユーザーが混乱する、検索エンジンの問題(これは2つの異なるサイトと見なされます)の問題が発生します。
Jeffrey Van Alstine
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.