新しいウェブサイト構造にリダイレクトするための.htaccess

May 17 2019

ウェブサイトの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]

回答

1 DocRoot May 20 2019 at 22:15

古いURL構造にseasonsand episodes(with )があり、新しいURL構造にand (no )があるため、少し複雑になります。そのため、URLパスをコピーするだけの一般的なソリューションを使用することはできません。sseasonepisodes

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 /使いやすさの観点からおそらく優れていますか?

JoseManuel May 18 2019 at 06:06

私はこれがあなたが必要とすることをするべきだと思います。

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]