web-dev-qa-db-ja.com

一般的なhtaccessがwwwを非wwwにリダイレクトをする

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

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

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

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

これが機能することを除けば、 Michael's と同じです。P

837
Ben

しかし、これを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]
105
Andron

非www から www にリダイレクト(両方: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]
70
Dmitriy

Httpd.confファイルでこれを実行したい場合は、mod_rewriteを使用せずに実行することができます(そして明らかに、パフォーマンスが向上します)。

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

私はここでその答えを得ました: https://serverfault.com/questions/120488/redirect-url-within-Apache-virtualhost/120507#120507

44
William Denniss

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]

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

33
Salman A
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R]

RewriteCondは、HTTP_Host変数 の後 / www.にすべてを取り込み、それを%1に保存します。

RewriteRuleは、先頭の/を付けずにURLを取得し、それを$1に保存します。

11
Michael Cramer

これを試して:

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

ホストがwwwで始まる場合は、ホスト全体をURLの先頭に固定してから、「www」を外します。

7
Greg

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

私は完全な答えを見ませんでした。私はこれを使ってWWWのインクルードを処理します。

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

これがどのように機能するのか、または抜け道がない場合は教えてください。

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

Htaccessのリダイレクトに関する誤情報がたくさんある可能性があります。このコードが機能することが期待される場合、まず最初に、あなたのサイトがWindowsホスト上ではなく、Apacheを使用してUnix上で実行されていることを確認してください。

RewriteEngine On

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

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

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

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

6

サイト全体にアクセスする必要がある人のためにWITHOUT 'www'プレフィックス。

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

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

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

サブフォルダー用

3
pelajar

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

wwwhttpの両方でhttpsを削除する場合は、次のようにします。

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

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

そしてSSL

apacheの2.4.*では、Redirectifディレクティブを使ってこれを実現できます。

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

使用: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

$.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);
        }
    }
});
2

上記のルールを使ってwwwからno wwwにしたところ、ホームページでは問題なく動作しましたが、内部ページでは/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]
2
Luke

ここで選択した答えと他の多くの解決策は/の後のURLの部分を削除したので、基本的には少なくともメインドメインには常にメインドメインにリダイレクトされます。

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

私がそれを働かせる唯一の方法は….

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

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

 RewriteEngineオン
 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からの拒否
1
mystique

.htaccessを使ってwwwまたはnon-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を=>に変更します。 !!!

1
Rohallah Hatami

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

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

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

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

0

なぜwwwを削除したいのかよくわかりません。しかし逆のバージョンは次のようになります。

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

そしてこのスクリプトの利点は:test.whattimein.comや他のもの(開発/テストのための環境)のようなものがある場合、それはUをオリジナルの環境にリダイレクトしない。

0
local