新しいウェブサイト構造にリダイレクトするための.htaccess
ウェブサイトのURL構造を変更したので、ユーザーをリダイレクトしたい
問題
新しい構造は非常に異なり、より厳密です。
古い
1 - https://example.com/serie-tv
2 - https://example.com/serie-tv/1845578-the-walking-dead
3 - https://example.com/serie-tv/1845578-The-Walking-Dead/seasons/1
4 - https://example.com/serie-tv/1845578-the-walking-dead/seasons/1/episodes/1
新着
1 - https://example.com/browse?type=series
2 - https://example.com/titles/1845578
3 - https://example.com/titles/1845578/season/1
4 - https://example.com/titles/1845578/season/1/episode/1
からのリダイレクト https://example.com/serie-tv/1845578-the-walking-dead/seasons/1
tohttps://example.com/titles/1845578-the-walking-dead/season/1
は機能しません。
にリダイレクトする必要があります https://example.com/titles/1845578/season/1
今のところ、私はすべてをにリダイレクトすることしかできませんでしhttps://example.com/serie-tv /.....
たhttps://example.com/browse?type=series
このコードで:
RewriteCond %{HTTP_HOST} ^example\.com$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^serie\-tv\/?(.*) "https\:\/\/example\.com\/browse?type=series" [R=301,L]
回答
古いURL構造にseasons
and episodes
(with )があり、新しいURL構造にand (no )があるため、少し複雑になります。そのため、URLパスをコピーするだけの一般的なソリューションを使用することはできません。s
season
episode
s
RewriteCond %{HTTP_HOST} ^example\.com$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.com$
ドメインが1つしかない場合、これらの条件は不要です。
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
今のところ、これらも無視できます。cPanelは、SSL証明書を自動更新するときに、必要に応じてこれらを自動的に挿入します。
今のところ、私はすべてをリダイレクトすることができました...
前の例のURLにはこれが記載されていないため、「すべて」をリダイレクトしたくないと思いますか?
RewriteRule ^serie\-tv\/?(.*) "https\:\/\/example\.com\/browse?type=series" [R=301,L]
読みやすさに影響を与える不要なバックスラッシュがここにエスケープされています。パターン-
内のリテラルハイフン()とスラッシュをエスケープする必要はありません。また、置換文字列(正規表現ではなく「通常の」文字列)では、コロン()、スラッシュ(再び)、およびドットをエスケープする必要はありません。これらの「リテラル」文字は、使用されるコンテキストでは特別な意味を持ちません。(これは、cPanelのリダイレクト機能を使用した典型的な出力です。これにより、cPanelも間違った場所に配置されることがよくあります。)RewriteRule
:
代わりに、.htaccess
ファイルの先頭近くで次のようなものを試してください。
RewriteEngine On
# Redirect "/serie-tv"
RewriteRule ^serie-tv$ /browse?type=series [R=302,L] # Redirect "/serie-tv/1845578-the-walking-dead" RewriteRule ^serie-tv/(\d+)-[^/]+$ /titles/$1 [R=302,L] # Redirect "/serie-tv/1845578-the-walking-dead/seasons/1" RewriteRule ^serie-tv/(\d+)-[^/]+/seasons/(\d+)$ /titles/$1/season/$2 [R=302,L]
# Redirect "/serie-tv/1845578-the-walking-dead/seasons/1/episodes/1"
RewriteRule ^serie-tv/(\d+)-[^/]+/seasons/(\d+)/episodes/(\d+)$ /titles/$1/season/$2/episode/$3 [R=302,L]
\d
は数字の省略文字クラス(と同じ[0-9]
)であり、\d+
1つ以上の数字に一致します。
$1
、$2
および$3
は、RewriteRule
パターン内のキャプチャされたグループへの後方参照です。サーバー変数をチェックする先行条件を使用する代わりに、RewriteRule
パターンで実行できることをテストする方が効率的REQUEST_URI
です。
これらは現在302(一時的な)リダイレクトであることに注意してください。キャッシュの問題を回避するために、正常に動作することをテストした場合にのみ、301(永続的)に変更してください。
テストする前に、ブラウザのキャッシュをクリアする必要があります。
余談ですが、タイトルを含む古いURL構造は、SEO /使いやすさの観点からおそらく優れていますか?
私はこれがあなたが必要とすることをするべきだと思います。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} /serie-tv$ [NC] RewriteRule ^(.*)$ browse?type=series [R=301,L]
RewriteCond %{REQUEST_URI} /serie-tv/([0-9]*)\-([^/]*)/?(.*)? [NC]
RewriteRule ^(.*)$ titles/%1/%3 [R=301,L]