すべての内部ページ (例: example.com/about
) を非 www バージョンにリダイレクトし、ホームページ ( https://example.com
) を www バージョン ( https://www.example.com
) にリダイレクトしたいと考えています。
インターネットで多くの記事を検索しましたが、うまくいきませんでした。
両方のルールを設定すると、内部ページは正常にリダイレクトされますが、ホームページはループに陥ります。
.htaccess
コードの書き方が分からないので、ファイルに貼り付けるコードを書いていただけると嬉しいです。
現在、以下のコードを使用して、すべてのページを非 www バージョン (ホームページも含む) にリダイレクトするように設定しています。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
</IfModule>
# BEGIN Sitepad
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>
# END Sitepad
答え1
インターネットで多くの記事を検索しましたが、うまくいきませんでした。
おそらく、これは奇妙な要件だからでしょう。これを単純にコピー/貼り付けできるコードが見つかったら驚きます。
ただし、すべての内部リンクに対して正しい絶対 URL を構築していると仮定すると (リダイレクトする URL に内部リンクしてはならないため)、.htaccess
既存のディレクティブを理解していれば、これを実装するのは比較的簡単です。
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC] RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
正規表現.*
はRewriteRule
パターンマッチすべて具体的には、量指定子で示される 0 個以上の任意の文字と一致します*
。空の URL パス (つまり、「ホームページ」) と空でないすべての URL パス (つまり、その他すべて) と一致します。
上記の正規表現を変更して、空でない URL パス (つまり、ホームページ以外のすべて) に一致するようにする必要があります。そして、空の URL パスのみに一致する別のルール (逆方向) を作成します。
index.php
(これは、mod_dir がホームページへのリクエストに対応しているという事実を利用しており、後続の mod_rewrite ディレクティブを利用しているわけではありません。)
1 つ以上の (つまり、空でない URL パス) を一致させるには、(星/アスタリスク)+
の代わりに (プラス) 量指定子を使用できます。*
例えば:
# Redirect everything except the homepage (from www to non-www)
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.+)$ https://example.com/$1 [L,R=301]
# Redirect the homepage only (from non-www to www)
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^$ https://www.example.com/ [L,R=301]
ホームページを www から non-www にリダイレクトする以前の 301 (永続的) リダイレクトがブラウザによってキャッシュされているため、テストの前にブラウザのキャッシュをクリアする必要があります。
潜在的なキャッシュの問題を回避するために、最初に 302 (一時的) リダイレクトでテストします。