一般的なhtaccessはwwwをwww以外にリダイレクトします


484

にリダイレクトwww.example.comしたいと思いexample.comます。次のhtaccessコードはこれを実現します:

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

しかし、ドメイン名をハードコーディングせずにこれを一般的な方法で行う方法はありますか?


64
www(または他のサブドメイン)を使用しない場合、すべてのCookieがすべてのサブドメインに送信され、静的コンテンツを提供するためのCookieのないサブドメインを使用できないため、ブラウザとサーバーの間でやり取りされるデータの量。:あなたが後で後悔する来るかもしれない何かtwitter.com/codinghorror/statuses/1637428313
サム・ハスラー

3
考慮すべきもう1つのことは、コンテンツの重複によるペナルティの可能性を回避するために、ページにwwwなしで正規名を設定していることを確認してください。また、リンクに絶対URLがある場合は、それらもすべて非wwwであることを確認してください。
ジェレミーモーガン

特に別のドメインの構成をコピーする場合は、明示的なリダイレクトを維持するほうがよいと思います。別のチューニングが必要になる場合があります(wwwドメインの方が適切な場合があります)weboptimizer.ch/2014/01/redirection-www
snowflake

このソリューションがルートURLを除くすべてのケースで機能する理由は何ですか?例えばdomain.comしないpiontにdomain.comに対し、domain.com/page1へリダイレクトを行いdomain.com/page1
ジェフソロモン

プロトコル(HTTPまたはHTTPS)を維持しながらwwwを非wwwにリダイレクト
MrWhite

回答:


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

これが機能することを除いてマイケルのと同じ:P


16
それが機能しない場合は、おそらくRewriteEngine Onそれを機能させるための前兆が欠けています。
ヘンドリー、

8
@ベン、wwwをwww以外のウェブサイトに追加するには、これを逆にどのように使用しますか?
anarkhos 2011年

18
にリダイレクトhttp://www.domain.com/http://domain.com//ます。に追加する必要/がありRewruteRuleます。これは私にとってはうまくいきRewriteRule ^/(.*)$ http://%1/$1 [R=301,L]ます。
Vladimir Prudnikov、

13
http://domain.com//ダブルスラッシュでリダイレクトすることで、ウラジミールと同じ問題を抱えていました。だから私はそうしましたRewriteRule ^(.*)$ http://%1$1 [R=301,L] 、そしてそれは今のところ
うまくいっ

5
:エレガントでありながら、それははるかに高速で、書き換えエンジンではなく、以下のソリューションを使用してくださいstackoverflow.com/questions/1100343/...
ビルラ

111

しかし、これを個別のhttpとhttpsに対して行う必要がある場合:

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

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

2
www.example.com/はexample.com//にリダイレクトします余分なスラッシュを削除する方法はありますか?
ボビーS

良い質問。上記で説明したルールの前に、追加のルール(つまり、この場合のみ)を使用するのが簡単な解決策になると思います。例: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron

3
@BobbyS この記事のソリューションを使用しました。wwwとHTTPを非www HTTPSにリダイレクトし、後続のも処理し/ます。
totymedli 2018年

これらのディレクティブをサーバー構成(または仮想ホスト)に直接配置した場合は、追加のスラッシュ(URLパスの先頭)のみが表示されます。では.htaccess、あなたの余分なスラッシュを取得するべきではありません。(注意してください、サーバーの構成でこのリダイレクトを実行している場合、おそらくmod_rewriteを最初から使用するべきではありません... Redirect適切なvhostコンテナー内の単純なmod_aliasの方がより効率的でエラーが発生しにくいでしょう。)
MrWhite

72

リダイレクト非WWWWWW(両方:HTTP + HTTPS)

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

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

4
@nightcoderこれは、Andronとは対照的な逆リダイレクト(www以外からwwwへの)の私の解決策です
Dmitriy

2
注:サブドメイン名を他の目的で使用する場合、この解決策はいくつかの問題を引き起こす可能性があります。たとえば、app.yourdomain.comはwww.app.yourdomain.comにリダイレクトされます。
Marty ZHANG、2014

1
これは質問に対する答えの正反対です。
John

とを追加する必要がRewriteEngine OnありましたがRewriteBase /、それ以外はうまくいきました。
2018年


33

wwwのURLをno-wwwにリダイレクトするためのルールは次のとおりです。

#########################
# redirect www to no-www
#########################

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

wwwなしのURLをwwwにリダイレクトするためのルールは次のとおりです。

#########################
# redirect no-www to www
#########################

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

NEapacheがクエリ文字列をエスケープしないようにするためにフラグを使用したことに注意してください。このフラグがない場合、Apacheは要求されたURL http://www.example.com/?foo%20barhttp://www.example.com/?foo%2250bar


1
httpをhttpsにリダイレクトするとともに、wwwを非wwwにリダイレクトするコードを記述できます
HYDER ALI

http://をhttps://に変更して、変更時にHTTPSに強制します。これらのルールによってリダイレクトされていないトラフィックに対して、通常のhttp-> httpsリダイレクトを追加することもできます。
diamondsea

11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

はのRewriteCondHTTP_HOST変数のすべてをキャプチャし、に保存します。www.%1

RewriteRuleリードなしでURLをキャプチャ/し、それを保存します$1


1
sans leading "/"- .htaccess(質問で述べたように)に先行がない/ため、パターンは一致せず、リダイレクトは発生しません。(サーバーまたはvirtualhostコンテキストでは先頭にスラッシュしかありません。)また、この後にmod_rewriteディレクティブがある場合は、Lフラグが必要になります。
MrWhite、

7

これを試して:

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

ホストがwwwで始まる場合、ホスト全体をURLの先頭に貼り付け、「www」を削除します。


1
RoBorg、残念ながらあなたの設定は機能しません、これを試してみると:example.com/hello/worldここで終わる:example.com/hello/world/world また、%{HTTP_POST}の後にスラッシュを追加する必要がありました。最初のRewriteRule
ディープウェル

2
私はApache / 2.2.9(Unix)を使用しています。これは、ウェブサイトにしかし、次のためにリダイレクトされ、www.websiteの作品:ウェブサイト/テスト - >に行く: websitetest:私は別の/セカンドのエラーを追加することで、これを固定サイト/テスト/ Nに行くwebsitetest / N / N
ディープウェル

1
この問題の@deepwellと同じ問題。
neemzy 2014年

以前の読者が抱えている問題は、これらのディレクティブがでなくサーバー構成(またはvhost)を対象としているため.htaccessです。では、ディレクトリのコンテキスト(.htaccess)は、最初に変更する必要がありRewriteRule読み:RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](2.2.12+はApacheが必要です)。スラッシュとDPI(パス情報の破棄)フラグが追加されていることに注意してください-以前のコメントで述べたように、URLパスの一部が重複しているように見える(実際には「パス情報」)のを防ぎます。ただし、他の回答で説明されているように、より単純なディレクティブがあります。
MrWhite、

7

完全な汎用WWWハンドラー、http / https

完全な答えは見つかりませんでした。これを使用して、WWWの包含を処理します。

  1. ジェネリック。ドメイン情報は必要ありません。
  2. プライマリドメインwww.domain.comに強制的にWWW
  3. サブドメインのWWWを削除します:sub.domain.com
  4. HTTP / HTTPSステータスを保持します。
  5. ドメイン/サブドメインの個別のCookieを許可します

これがどのように機能するか、または抜け穴を残したかどうか教えてください。

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]

元の質問はにリダイレクトwwwするように求めていwwwます。あなたはを含めることを強制していますwww
Vadim

6

htaccessリダイレクトについては、多くの誤った情報がある可能性があります。まず、このコードが機能することが予想される場合は、サイトがWindowsホストではなく、Apacheを使用するUnixで実行されていることを確認してください。

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

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

(ただし、テキストの各行の間に行スペースがないことを確認してください。行間に余分なスペースを追加して、このウィンドウで正しく表示されるようにします。)

これは、サイトのwwwバージョンをhttp://バージョンに誘導するために使用できるコードのスニペットの1つです。使用できる他の同様のコードもあります。


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

サブフォルダー用


3

必要サイト全体にアクセスできるようにするものについてはなし「WWW」プレフィックス。

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

これを次のファイルに追加してください。

/site/location/.htaccess 

この例は完全ではありません- protossl環境変数を設定していません(これは標準/サーバー変数ではありません)。これは常に空になるため、常ににリダイレクトされhttpます。(protosslコードの前半の設定の背後にある考え方は、リダイレクト時にプロトコルを維持したい場合のためのものです。しかし、最近はおそらくhttps常にリダイレクトする必要があります。)
MrWhite

3

.htaccessを使用してwwwまたはwww以外にリダイレクトする:

次のコード行をメインのルート.htaccessファイルに挿入するだけです。どちらの場合も、domain.comを独自のホスト名に変更するだけです。

wwwにリダイレクト

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

www以外にリダイレクト

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

DOTを=>に変更します。!!!


2

私は上記のルールを使用してwwwをwwwなしにfwdし、ホームページでは正常に機能しますが、内部ページでは/index.phpに転送しています

これを引き起こしているが、何をすべきかわからない私の.htaccessファイルにこの他のルールが見つかりました。どんな提案も素晴らしいでしょう:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

引用したものの前に、www以外のリダイレクトルールを配置する必要があります。
VladimirJovanović2017年

2

httpsでwwwから非wwwへ

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

とのwww両方を削除する場合は、次を使用します。httphttps

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

これは非sslをリダイレクトします

そしてSSL

Apache 2.4.*では、Redirectwith ifディレクティブを使用してこれを達成できます、

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

2

使用:Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

または.htaccess:

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

そしてPHPメソッド:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

アヤックス

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

1

私がそれを機能させる唯一の方法...

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

1

あなたがwwwを強制している場合。URLまたは強制sslプロトコルで、htaccessファイルで次のようなバリエーションを使用してみてください。

RewriteEngine On
RewriteBase /

### WWWを強制する###

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

## SSLを強制する###

RewriteCond%{SERVER_PORT} 80 
RewriteRule ^(。*)$ https://example.com/$1 [R、L]

## IPをブロックする###
注文拒否、許可
256.251.0.139から拒否
199.127.0.259から拒否

Apacheは別のポート、たとえば81をリッスンできます。したがって、そのRewriteCond %{SERVER_PORT} 80ようなより一般的なチェックを使用することをお勧めします:RewriteCond %{HTTPS} off
Andron

1

選択した回答と他の多くの解決策は、/の後にURLの一部を削除したため、基本的には少なくとも私にとっては常にメインドメインにリダイレクトされます。したがって、スラッシュの後にフルパスを考慮して作業サンプルを追加しています。

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

1

.htaccessのカスタマイズが理想的なオプションではない場合の代替アプローチ:

公開用のシンプルなリダイレクトサーバーを作成しました。AまたはCNAMEレコードを追加するだけです。

CNAME   r.simpleredirect.net
A       89.221.218.22

詳細:https : //simpleredirect.net


0

wwwを削除する理由がわかりません。しかし、逆バージョンは次のようになります:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

このスクリプトの利点は次のとおりです。uにtest.whattimein.comなどの環境(開発/テスト用の環境)がある場合、Uは元の環境にリダイレクトされません。


2
wwwサブドメインを含めるかどうかは、実際には個人の好みの問題であり、ドメイン名と対象ユーザーによって異なります。wwwをnone-wwwにリダイレクトするための上記の一般的なコードは、「www」の場合にのみリダイレクトが行われるため、テスト環境でも問題なく処理できます。サブドメインが検出されました。
MrWhite、2012年

1
この質問は、ユーザーが求めていることとは正反対であり、投稿を汚染するだけです。
Vadim

0

これは、Apache 2.4で動作するように更新されています。

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

Michaelに対する唯一の変更[NC]は、「AH00665」エラーを生成するを削除することです。

非正規表現パターン '-f'のNoCaseオプションはサポートされていないため無視されます


以前の回答では、「Apache 2.4で動作するように更新する」必要はありませんでした。引用している「警告」(AH00665)は、別のディレクティブに関連しています(たとえば、のようなものがある場合RewriteCond %{REQUEST_FILENAME} !-f [NC])。NCフラグは上記で少し違いが、しかし、その理由NCフラグをする必要があり、ここで使用することは、(間違って)大文字のホスト名を送信するボットトラフィックのごく一部をキャッチすることです。
MrWhite

0

ローカルホストの場合、リダイレクトを無視します(ローカル環境での開発目的のため)。localhostでなく(httpsでもwwwでもない)、httpsとwww以外にリダイレクトします。

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

OPがこれがどのように質問に答えるかを理解できるように、コードを詳しく説明してください。
RyanNerd

-2

こんにちは、htaccessファイルで次のルールを使用できます。

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

問題は、ドメイン名を含まない「一般的な」ソリューションを求めていることです。あなたの解決策はまた、説明なしに質問で求められていることの完全に反対のこと(wwwからwwwへではなく、wwwからwwwへではない)を行います。
MrWhite
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.