にリダイレクトwww.example.com
したいと思いexample.com
ます。次のhtaccessコードはこれを実現します:
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
しかし、ドメイン名をハードコーディングせずにこれを一般的な方法で行う方法はありますか?
にリダイレクトwww.example.com
したいと思いexample.com
ます。次のhtaccessコードはこれを実現します:
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
しかし、ドメイン名をハードコーディングせずにこれを一般的な方法で行う方法はありますか?
回答:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
これが機能することを除いてマイケルのと同じ:P
RewriteEngine On
それを機能させるための前兆が欠けています。
http://www.domain.com/
しhttp://domain.com//
ます。に追加する必要/
がありRewruteRule
ます。これは私にとってはうまくいきRewriteRule ^/(.*)$ http://%1/$1 [R=301,L]
ます。
http://domain.com//
ダブルスラッシュでリダイレクトすることで、ウラジミールと同じ問題を抱えていました。だから私はそうしましたRewriteRule ^(.*)$ http://%1$1 [R=301,L]
、そしてそれは今のところ
しかし、これを個別の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]
RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L]
...
/
ます。
.htaccess
、あなたの余分なスラッシュを取得するべきではありません。(注意してください、サーバーの構成でこのリダイレクトを実行している場合、おそらくmod_rewriteを最初から使用するべきではありません... Redirect
適切なvhostコンテナー内の単純なmod_aliasの方がより効率的でエラーが発生しにくいでしょう。)
リダイレクト非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]
RewriteEngine On
ありましたがRewriteBase /
、それ以外はうまくいきました。
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
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]
NE
apacheがクエリ文字列をエスケープしないようにするためにフラグを使用したことに注意してください。このフラグがない場合、Apacheは要求されたURL http://www.example.com/?foo%20bar
をhttp://www.example.com/?foo%2250bar
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]
はの後RewriteCond
のHTTP_HOST
変数のすべてをキャプチャし、に保存します。www.
%1
RewriteRule
リードなしでURLをキャプチャ/
し、それを保存します$1
。
sans leading "/"
- .htaccess
(質問で述べたように)に先行がない/
ため、パターンは一致せず、リダイレクトは発生しません。(サーバーまたはvirtualhostコンテキストでは先頭にスラッシュしかありません。)また、この後にmod_rewriteディレクティブがある場合は、L
フラグが必要になります。
これを試して:
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ %{HTTP_HOST}$1 [C]
RewriteRule ^www\.(.*)$ http://$1 [L,R=301]
ホストがwwwで始まる場合、ホスト全体をURLの先頭に貼り付け、「www」を削除します。
.htaccess
です。では、ディレクトリのコンテキスト(.htaccess
)は、最初に変更する必要がありRewriteRule
読み:RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI]
(2.2.12+はApacheが必要です)。スラッシュとDPI
(パス情報の破棄)フラグが追加されていることに注意してください-以前のコメントで述べたように、URLパスの一部が重複しているように見える(実際には「パス情報」)のを防ぎます。ただし、他の回答で説明されているように、より単純なディレクティブがあります。
完全な汎用WWWハンドラー、http / https
完全な答えは見つかりませんでした。これを使用して、WWWの包含を処理します。
これがどのように機能するか、または抜け穴を残したかどうか教えてください。
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
。
htaccessリダイレクトについては、多くの誤った情報がある可能性があります。まず、このコードが機能することが予想される場合は、サイトがWindowsホストではなく、Apacheを使用するUnixで実行されていることを確認してください。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
(ただし、テキストの各行の間に行スペースがないことを確認してください。行間に余分なスペースを追加して、このウィンドウで正しく表示されるようにします。)
これは、サイトのwwwバージョンをhttp://バージョンに誘導するために使用できるコードのスニペットの1つです。使用できる他の同様のコードもあります。
必要サイト全体にアクセスできるようにするものについてはなし「WWW」プレフィックス。
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]
これを次のファイルに追加してください。
/site/location/.htaccess
protossl
環境変数を設定していません(これは標準/サーバー変数ではありません)。これは常に空になるため、常ににリダイレクトされhttp
ます。(protossl
コードの前半の設定の背後にある考え方は、リダイレクト時にプロトコルを維持したい場合のためのものです。しかし、最近はおそらくhttps
常にリダイレクトする必要があります。)
.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を=>に変更します。!!!
私は上記のルールを使用して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]
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]
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
両方を削除する場合は、次を使用します。http
https
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.*
では、Redirect
with if
ディレクティブを使用してこれを達成できます、
<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
使用: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);
}
}
});
あなたが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から拒否
RewriteCond %{SERVER_PORT} 80
ようなより一般的なチェックを使用することをお勧めします:RewriteCond %{HTTPS} off
.htaccessのカスタマイズが理想的なオプションではない場合の代替アプローチ:
公開用のシンプルなリダイレクトサーバーを作成しました。AまたはCNAMEレコードを追加するだけです。
CNAME r.simpleredirect.net
A 89.221.218.22
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は元の環境にリダイレクトされません。
これは、Apache 2.4で動作するように更新されています。
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Michaelに対する唯一の変更[NC]
は、「AH00665」エラーを生成するを削除することです。
非正規表現パターン '-f'のNoCaseオプションはサポートされていないため無視されます
RewriteCond %{REQUEST_FILENAME} !-f [NC]
)。NC
フラグは上記で少し違いが、しかし、その理由NC
フラグをする必要があり、ここで使用することは、(間違って)大文字のホスト名を送信するボットトラフィックのごく一部をキャッチすることです。
ローカルホストの場合、リダイレクトを無視します(ローカル環境での開発目的のため)。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]