web-dev-qa-db-ja.com

mod_rewrite:アンダースコアをダッシュ​​に置き換えます

ここでREGEX-fuの恥ずかしい無知を明らかにしていますが、現在、記事のURLのロードが「article_name」と書かれているのに対し、新しいものは「article-name」と書かれているWebサイトがあります。

それらすべてをダッシュ​​を使用するように移動したいので、古いURLを新しい同等のものに書き換えるために使用できる正規表現はありますか?

よろしくお願いします!

19
Keith Williams

まず、既存のURLで一貫性を実現する必要があります。基本的に、常にダッシュを使用するには、既存のすべての名前を正規化する必要があります。わかりました、あなたはそれをしました。

次の仮定から始めます。

URLはおおよそ次の形式です。

 http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name 

ここで、/articlesの下のURLのみを書き換える必要があり、/faulty_article_name部分のみをサニタイズする必要があります。

大幅に更新され、実際に機能するものが追加されました

Apacheの場合:

RewriteEngine     On
RewriteRule       ^(/?articles/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N]
RewriteRule       ^(/?articles/.*/[^/]*?)_([^/_]*)$       $1-$2 [R=301]

これは一般的にGAppleの答えに触発されています。

最初の/?は、このコードがvhostconfsと.htaccessファイルの両方で実行されることを保証します。後者は、先頭のスラッシュを期待していません。

次に、articles/部分を追加して、ルールが/articles内のURLにのみ適用されるようにします。

次に、URLに少なくとも2つのアンダースコアがありますが、ルールをループし続けます。アンダースコアが1つしか残っていない場合は、2番目のルールが適用され、ダッシュに置き換えられ、永続的なリダイレクトが行われます。

ふぅ。

22
kch

これを試して:

RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

最初のルールは、残りが1つ以下になるまで、一度に1つのアンダースコアを置き換えます。次に、最後のルールが最後のアンダースクロールを置き換え、外部リダイレクトを実行します。

14
Gumbo

考えるべき潜在的な異なるアプローチ:

このアイデアでは、「古い形式」と「新しい形式」が異なるディレクトリにあると想定しています。そうでない場合は、新しい形式に異なるディレクトリ名を付けることを検討してください。

例えば:

http://site.com/articles/2008/12/31/new_years_celebration
http://site.com/article/2008/12/31/new-years-celebration

この場合、mod_rewriteを使用して「古いディレクトリ」内のすべてを検出し、それを「redirector.php」にリダイレクトできます。

考え直してみますが、mod_rewriteは次のようなものを探すことができます。

RedirectRule /articles/(.*_.*)/redirector.php?article=$1

何かを_と照合し、リダイレクタを介して送信します。

Redirector.php内で、$_SERVER['REQUEST_URI']を取得し、preg_replaceやデータベースクエリなどのツールを使用して、リダイレクト先の正しいURLを見つけたり、古いURLへのヒット数を調べたりすることができます。

2
gnarf

Mod rewriteは、実際のURLが何であるかをどのように知るのでしょうか?アンダースコアまたはダッシュを使用するようにすべての記事を書き直すことができますが、mod_rewriteが新しい場所が存在するかどうかを判断する方法はありません。

例えば、

/I_Like_Beesは/path/i_like_bees
/I-like-flowersは/path/i-like-flowers
として保存されます。

i-like-beesi_like_beesに書き換えます。

  • アンダースコアをダッシュ​​に書き直すと、i_like_beesが見つかりません
  • ダッシュをアンダースコアに書き換えると、i-like-flowersが見つかりません

すべての記事を一貫して保存していれば、書き換えルールを簡単に機能させることができます。代わりに、ディレクトリの存在を確認し、正しい場所に301リダイレクトするスクリプトを作成する必要があります。

1
Byron Whitlock

メソッドは次のとおりです: http://yoast.com/Apache-rewrite-dash-underscore/

基本的に、URLをアンダースコアの両側のトークンに分割し、アンダースコアを置き換えてトークンを再度書き換えます。問題は、一度に1つのアンダースコアしか置き換えないことです。それはより近いが完全には正しくないURLにリダイレクトし、それは再びさらに近いURLにリダイレクトしますが、おそらくそれでも正しいURLではありません...

アンダースコアとトークンを連続して増やすいくつかの書き換え条件とルールを使用して複数のリダイレクトを修正することをお勧めしますが、これには、最長のタイトルにアンダースコアがあるのと同じ数の条件とルールが必要になります。

ただし、ルールによって変更したくないパス(画像ファイルなど)がそのまま置き換えられる場合があるため、可能であれば修飾子を追加してください。

0
gapple