web-dev-qa-db-ja.com

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

非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] 

私は何が欠けていますか?

194
user121196

書き換えエンジンの使用は、この問題を解決するためのかなり重い方法です。より簡単なソリューションを次に示します。

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

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

そして、実サーバー構成用に<VirtualHost>を含む別の ServerName www.example.com セクションがあります。 Redirect directive を使用する場合、Apacheは/の後のすべてを自動的に保存します。これは、このメソッドが機能しない理由(実際に機能する場合)についての一般的な誤解です。

481
Greg Hewgill

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]
76
burzumko
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
44
cherouvim

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

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

ウェブサイトwwwURLを強制するには、.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.comURLに置き換える必要があります。

30
Sergio Martins
    <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にリダイレクトします。

乾杯!

21
Dishan Philips

これは、他の多くの提案に似ていますが、いくつかの機能強化があります。

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

    RewriteCond %{HTTP_Host} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_Host}/$1 [R=301,L]
    
15
weotch
RewriteCond %{HTTP_Host} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

これはHTTP_Host変数で始まります。この変数には、着信URLのドメイン名部分(example.com)のみが含まれます。ドメイン名にwww.が含まれておらず、ドメイン名と正確に一致すると仮定すると、RewriteRuleが作用します。パターン^(.*)$は、REQUEST_URI内のすべてと一致します。これは、HTTP要求(foo/blah/index.html)で要求されたリソースです。これを後方参照に保存し、新しいドメイン名(wwwで始まる名前)でURLを書き換えるために使用されます。

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

10
Curtis Tasker

これを走らせた...

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

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

ただし、完全なdocrootがパターンマッチで実行されているため、書き換えルールを少しハックしなければなりませんでした http://httpd.Apache.org/docs/2.2/mod/ mod_rewrite.html は、ホストとポートの後にのみ存在することを示しています。

5
Andrew Deal

Www以外=> wwwおよび反対のwww => www以外のリダイレクトコード。 .htaccessファイルにハードコーディングドメインとスキームはありません。したがって、Originドメインと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 =>非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 =>非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からのみ使用可能なため、短いバージョンは使用できません...

5
mikep

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

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

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]
  • 他のsudomainsはまだ機能しています。
  • 線を調整する必要はありません。適切な場所にコピーして貼り付けてください。

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

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

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

これにより、ドメイン名だけでなく、内部のページもリダイレクトされます。

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

2
Aneesh R S

これを試して:

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

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

この完璧な作品をチェックしてください

1
Tejinder singh

これは簡単です!

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

Redirect permanentを常に使用しない(または問題が発生する理由)

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

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

redirect permanentHTTP 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
MA-Maddin

これは私のために働く:

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

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

0

私が使用するコードは:

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

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

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/