2016-06-19 21 views
0

ウェブサイトのURL名がSEOの理由で変更されました。それがあった:今mod_rewrite 301古いURLから新しいURLにリダイレクト

/category/filter1/f00/filter2/123/filter3/100-500/filter4/36.html 

/category/color/red/size/big/price/100-500/style/classic.html 

私は古いものと新しい名前を知って、彼らは固定しています。古いURLから新しいURLに301リダイレクトされるリライトルールを作成するのを手伝ってください。私は研究を行いました。例えば、RewriteMapを使って作ることができないことが分かりましたので、 RewriteRule (.*)filter1(.*) $1color$2 [L]などのようなものを作ってしまいました。私は見た目が気に入らないだけでなく、301リダイレクトもしません。

UPDATE:現時点では私は、フィルタの名前/値ごとに1つ、例えば、いくつかのルールを持っていることを注:

RewriteEngine on 

# make sure it's a catalog URL, not anything else 
RewriteCond %{REQUEST_URI} !^/(category1|category2|category3|category4) 
RewriteRule .* - [L] 

# rewrite filter names 
RewriteRule (.*)filter1(.*) $1color$2 [L] 
RewriteRule (.*)filter2(.*) $1price$2 [L] 
...etc... 

それ期待通りに動作します - URL内のすべての名前を変更しますが、Rフラグを設定します最初のルールで停止し、次のようなURLにリダイレクトされます。

/var/www/vhosts/site/htdocs/category/color/red/filter2/123/ etc... 

フィルタがURLに存在する場合と存在しない場合があるため、ルールが分かれています。より良い解決法を大いに歓迎します。

答えて

1

これは私自身の答えです:環境変数で行うことができます。古いフィルタの名前と値を新しいURLに置き換え、新しいURLに301のリダイレクトを1つだけ作成する必要があります。ここで私はmod_rewriteをして、環境変数を使用して何をやったか:基本的に、私は環境変数filtersにURLを全体にフォーマットを変更した

RewriteEngine on 

RewriteRule /filter1/    - [E=filters:/color/] 
RewriteRule /f00[.\/]    - [E=filters:%{ENV:filters}red] 
RewriteRule /0f0[.\/]    - [E=filters:%{ENV:filters}green] 
RewriteRule /00f[.\/]    - [E=filters:%{ENV:filters}blue] 

RewriteRule /filter2/    - [E=filters:%{ENV:filters}/size/] 
RewriteRule /123[.\/]    - [E=filters:%{ENV:filters}big] 
RewriteRule /32[.\/]    - [E=filters:%{ENV:filters}small] 

RewriteRule /filter3/([^/^\.]+)  - [E=filters:/price/$1] 

RewriteRule /filter4/    - [E=filters:%{ENV:filters}/style/] 
RewriteRule /36[.\/]    - [E=filters:%{ENV:filters}classic] 
RewriteRule /37[.\/]    - [E=filters:%{ENV:filters}urban] 

RewriteCond %{REQUEST_URI} ^/(category1|category2|category3|category4)/ 
RewriteCond %{ENV:filters} !^$ 
RewriteRule ^([^/]+)/ /$1%{ENV:filters}.html [L,R=301] 

それは、ウェブサイトのカテゴリではなく、いくつかの他の一部だ場合、その後にチェックし、最終的に作られましたこのカテゴリ+フィルタ変数にリダイレクトし、最後に.htmlを追加しました。

+0

涼しい、非常に建設的なアプローチ! –

0

新しいURLは、人間にきれいに見えるにもかかわらず、私はSEOの理由で、既存のURLを変更する必要があるかどうかわかりません。


リライトの代わりにリダイレクトを取得するには、R|redirectフラグを使用する必要があります。だからあなたのルールは

RewriteRule (.*)filter1(.*) $1color$2 [R,L] 

のようになります。しかし、あなたは複数のリダイレクトを使用している場合、これは、マイナスのあなたのSEOの結果に影響を与えるChained 301 redirects should be avoided for SEO , but Google will follow 2 or 3 stacked redirects

  • は、理想的には、あなたが任意の積み重ねリダイレクトを持っているか、またはべきではないことに注意してください表示される場合がありますあなたがそれを助けることができれば1つのリダイレクトも必要ですが、Googleは連鎖したリダイレクトに従います
  • しかし、リダイレクトを追加するたびに、Googleがリダイレクトに従わずにPageRankを渡す可能性が高くなります。
  • あなたはこれを一度

    RewriteRule ^(.*)/filter1/(.*)/filter2/(.*)$ $1/color/$2/size/$3 [R,L] 
    
    で複数のフィルタを交換しようと意味すべて

で連鎖リダイレクトをサポートしていない可能性が

  • ビンビンにしている場合
  • Googleにとって2に、最大3回のリダイレクトでそれを保ちます

    など。


    フィルタは、任意の順序で来るかもしれないとき、あなたはいくつかのルールを使用してREDIRECT_STATUSで終了

    RewriteRule ^(.*)filter1(.*)$ $1color$2 [L] 
    RewriteRule ^(.*)filter2(.*)$ $1price$2 [L] 
    RewriteRule ^(.*)filter3(.*)$ $1size$2 [L] 
    
    RewriteCond %{ENV:REDIRECT_STATUS} 200 
    RewriteRule^%{REQUEST_URI} [R,L] 
    

    RewriteCondでリダイレクトを行うことができます無限ループを防ぐためにそこにあります。


    それはそれが必要として動作

    、あなたはR=301Rを置き換えることができます。 R=301でテストしないでください。

    最後の注記は、これらの実験に注意して非常にです。テスト中にマシンを2回殺しました(反応がなくなり、スイッチを切らなければなりませんでした)。

  • +0

    詳細な回答ありがとうございます。 「SEOの理由」については、URLの一部が母国語で書かれており、SEOが英文に翻訳する方が良いことが実験で証明されています(音訳)。チェーンに関しては、なぜそれがリダイレクトチェーンになるべきですか?古いURLと新しいURLがあり、それらの間に301リダイレクトを設定しました。新しいページには古いURLは含まれていないので、Googleが他のリダイレクトを行う必要はありません。私を訂正してください。 'R'フラグについては設定しようとしていましたが、いくつかのルールがあります(更新後を参照)。最初のルールの後に停止します。 – Martin

    +0

    フィルタごとに個別のルールがある場合filter1 R - > filter2 R - > filter3 R - > filter4 Rには4つのリダイレクトがあります。これにより、4回のラウンドトリップがあり、ページランクに影響を与えるリダイレクトチェーンもあるため、ページの読み込みが遅くなります(ユーザーエクスペリエンスには悪い)。免責事項、私はSEOの専門家ではありません。 –

    +0

    間違いなく、複数のリダイレクトは必要ありません。これはちょうど1つでできますか?それともmod_rewriteでは不可能ですか? – Martin

    関連する問題