2011-10-04 30 views
8

アンダースコアを含むリクエストはすべて同じURLにリダイレクトしたいのですが、ハイフンで置き換えてください。htaccessでは、アンダースコアをハイフンに置き換えて、ユーザーに新しいURLをリダイレクトしたいとします。

は(無数に本のRewriteRuleまでの増分バージョンを繰り返します)

rewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3-$4 [R=301,L] 
rewriteRule ^([^_]*)_([^_]*)_(.*)$ http://example.com/$1-$2-$3 [R=301,L] 
rewriteRule ^([^_]*)_(.*)$ http://example.com/$1-$2 [R=301,L] 

PHPで私の現在のソリューションがある(正常に動作します):私は、フォーラムの多くは、私はこのような何かを示唆見てきました:

if(preg_match('/[_]+/', $_SERVER['REQUEST_URI'])){ 
    $redirectUrl = preg_replace('/[_]+/','-', $_SERVER['REQUEST_URI']); 
    header('Location: '. $redirectUrl , TRUE, 301); 
    return; 
} 

しかし、私はむしろ代わりに、各URLがあるかもしれないどのように多くのアンダー予想するために、何度も何度もその最初のRewriteRuleを繰り返すことなく、私のhtaccessファイルに保管してくださいPHP &を使用していないと思います。思考?増分されたrewriteRuleを繰り返すことなくこれを行う方法はありますか?

----- -----編集

私の現在のhtaccessファイルは、以下の通りですちょうど標準のWordPress 1、次のとおりです。組み合わせについて2.持っているか

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
+0

これが私の唯一の方法でありますそれが動作するかどうかを確認するには、mod rewriteでReplacesを使用せず、一致したパターンのルールのみを書き換えます。 –

答えて

4

ルールセットは、最初のルールから再評価される原因となる、フラグを書き換える/「次へ」ディレクティブを参照してください:このようなhttp://httpd.apache.org/docs/current/rewrite/flags.html#flag_n

何かがうまくいくかもしれない:

RewriteRule (.*)_(.*) $1-$2 [N] 
+1

テスト済みです、うまくいきます! +1の賢さ。 –

+0

@llmari Karonen - 私は不思議です、あなたはこれをテストするためにあなたが使ったURLは何ですか? – Schoffelman

+0

私はこれをルールとして使用しました。RewriteRule ^([^ _] *)_(。*)$/$ 1- $ 2 [R = 301、L] – Schoffelman

0

置換とリダイレクトを行うPHPスクリプトに書き換える単一の書き換えルール。そうすることで、複数のリライトルールを避け、任意の数のアンダースコアを処理し、必要に応じてPHPリダイレクトのみを呼び出すことができます。

関連する問題