質問

私の Web サイトでは、www 以外から www にリダイレクトされないようです。

私のApache構成は次のとおりです。

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

私には何が欠けているのでしょうか?

役に立ちましたか?

解決

書き換えエンジンを使用することで、この問題を解決するために、かなりヘビー級方法です。ここでは簡単な解決策はあります:

<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 のセクションを持っています設定。 /ディレクティブに使用しているときにApacheが自動的にRedirect後に何を保存し、これは(実際にはそれがない場合)、このメソッドは動作しません理由についてよくある誤解です。

他のヒント

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

あなたの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に置き換える必要があります。

    <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で、そのディレクトリにあなたのウェブサイトを実行する場合。

、それは第二の仮想ホスト部に来ることができませんでした。ここではwww.example.com以外はwww.example.comにリダイレクトされます。

ここでの順序は重要です。あなたは第一、第二VirtualHostディレクティブを追加した場合、それはリダイレクトループが発生します。

このソリューションは、www.yourdomain.comに、あなたのドメインへのすべての要求をリダイレクトされます。

乾杯!

これは、いくつかの機能拡張を備えた他の多くの提案と似ています。

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

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

このは、着信URL(HTTP_HOST)のちょうどドメイン名部分が含まれているexample.com変数、で始まります。ドメイン名がwww.が含まれており、正確に自分のドメイン名と一致しないと仮定すると、その後のRewriteRuleが場に出ます。パターン^(.*)$は、HTTPリクエスト(REQUEST_URI)で要求されたリソースであるfoo/blah/index.htmlのすべてを、一致します。これは、新しいドメイン名(wwwで始まるもの)でURLを書き換えるために使用されて戻って参照、でこれを保存します。

[NC][R=301]コード301(リソースが恒久的に移動)を使用して外部のリダイレクトを示し、大文字と小文字を区別しないパターンマッチングを示し、[L]はさらに書き換え全て停止し、直ちにリダイレクトします。

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

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

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

ただし、完全な docroot がパターン一致で実行されていたため、書き換えルールに少しハックを行う必要がありました。 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html ホストとポートの後にのみ存在することについて述べています。

の両方の非WWW => WWWと反対WWWのためのリダイレクトコード=>非WWW。 .htaccessファイルでのいかなるハードコーディングドメインはなく、制度。だから、元のドメインおよびHTTP / HTTPSのバージョンが保存されます。

APACHE 2.4およびそれ以降の

NON-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使用コードとの互換性のためにまたは固定されたHTTP / HTTPSで%{REQUEST_SCHEME}を置き換える。

<時間>

APACHE 2.2以降

NON-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モジュールを有効にする必要がなく、Apacheの2.4を使用している場合:

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

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]
  • 他の sdomain はまだ動作しています。
  • ラインを調整する必要はありません。適切な場所にコピー/ペーストするだけです。

vhost を変更する場合は、Apache の変更を忘れずに適用してください。

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

<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

これを試してみてください:

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

これは簡単です!

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

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

この完璧な作品をご確認ください。

常に使用しないでください 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 - 正規ホスト名

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

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/する

これは私のために動作します:

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

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

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

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

上記の 2 つの解決策を使用する場合 <VirtualHost *:80> 異なるブロック 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

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

私は、リダイレクトルールは(私がネットワークに追加したい任意のドメインについて)汎用的でなければならなかった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]

私は、複数のバーチャルホストを使用している場合、それは簡単に(そしてより有用)にServerAliasを使用することが分かっています。

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

これはまた、HTTPSのバーチャルホストで動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top