web-dev-qa-db-ja.com

htaccessを書き換えて、数値IDをURLの先頭から末尾に移動し、「。html」を削除します

サイトの移行と古いリンクに問題があります。現在、サーバーの移行だけでなく、CMSの移行でもありました。サイトはumbraco(asp.net)からwordpressに移行しました。問題は、Googleが古いURLにインデックスを付けたことです。リンクをリワークしてそれらを機能させる方法があります。このメソッドを使用してリンクをリワークし、リダイレクトにWPプラグインを使用しました。問題は、このプラグインの多くのリンクへの道があるということです。

私は、htaccessを使用してリンクを動的にリワークする方法があるのだろうかと考えていました。そのため、リンクの書き換え方法は次のとおりです。

http://example.com/something/XXXXX-some-text.html
-->
http://example.com/something/some-text-XXXXX
where XXXXX is some number between 100 and 100,000

この方法は機能しますが、唯一の問題は60,000以上のリンクがあることです...

助言がありますか?

追伸スキップする必要がある他のリンクもいくつかあります。それらを再処理する方法がないためです...

2
klo

http://example.com/something/XXXXX-some-text.html
-->
http://example.com/something/some-text-XXXXX
XXXXは100〜100,000の数字です

「100,000」には文字通りカンマが含まれていないと思いますか?そして、数字の後のハイフン(-)はリテラルであると想定しているため、数字の後に1つのハイフンが続き、その後に<some-text>が続きます。そして、その<some-text>は、大文字、小文字、数字、ハイフンのみで構成できます。それともXXXXX<sometext>.htmlであるはずですか?

ルートの.htaccessファイルで次のようなものを試すことができます。これを行う必要がありますbefore any WordPress_ rewrites。

RewriteRule ^(something)/(\d{3,6})-([a-zA-Z0-9-]+)\.html /$1/$3-$2 [R=302,L]

これにより、元のリクエストのクエリ文字列もパススルーされます。クエリ文字列を削除する必要がある場合は、RewriteRule置換の最後に?を追加します(またはApache 2.4の場合はQSDフラグを含めます)。

正規表現の数値は、文字通り、3〜6文字の数字の文字列です(両端を含む)。文字通り、文字通り100〜100000ではありません。

これは現在302(一時)リダイレクトです-ブラウザによってキャッシュされないため、テストが容易になります。正常に機能していることが確認できたら、これを301(永続)に変更します。

追伸スキップする必要がある他のリンクもいくつかあります。それらを再処理する方法がないためです...

このパターンに従っているがスキップする必要があるURLがある場合、いくつかの例外を作成する必要があります。このルールの前にある条件(RewriteCond)です。何かのようなもの:

RewriteCond %{REQUEST_URI} !^/something/123-exclude-this\.html
RewriteCond %{REQUEST_URI} !^/something/456-and-exclude-this\.html
RewriteRule ^(something)/(\d{3,6})-([a-zA-Z0-9-]+)\.html /$1/$3-$2 [R=301,L]

または、スキップする必要があるURLのパターンがある場合、これらを適切な正規表現と組み合わせることができます。

CondPatternRewriteCondディレクティブの2番目の引数)の!プレフィックスは、正規表現を無効にします。したがって、上記のルールセットは基本的に、要求が指定されたパターンに一致し、thisまたはthatでない場合はリダイレクトします。


編集:「何か」が可変の場合、各選択肢をRewriteRuleパターンに入れることができます。

RewriteRule ^(category/subcategory|category/sub/subsub)/(\d{3,6})-([a-zA-Z0-9-]+)\.html /$1/$3-$2 [R=301,L]

または、URLに応じて(および競合が発生するかどうかに応じて)完全に汎用にすることもできます。

RewriteRule ^(.+)/(\d{3,6})-([a-zA-Z0-9-]+)\.html$ /$1/$3-$2 [R=301,L]

$1$2および$3は、RewriteRulepattern内の括弧で囲まれたサブパターン(キャプチャされたグループ)への後方参照です。したがって、$1は、URLパスで一致する(.+)で置き換えられます。

1
MrWhite