Apache が非 www から www にリダイレクト
-
11-09-2019 - |
質問
私の 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>
私は同じ問題を抱えてきました。 しかし、これで解決します。
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のバーチャルホストで動作します。