すべてのページを非 www にリダイレクトし、1 つのページを www にリダイレクトします。

すべてのページを非 www にリダイレクトし、1 つのページを www にリダイレクトします。

すべての内部ページ (例: 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 (一時的) リダイレクトでテストします。

関連情報