2009-04-07 5 views
1

仮定がドメインとの間でディレクトリのセット番号が存在しないということです私はmod_rewriteはすることはかなり新しいだと私はmod_rewriteで再帰置換を作成するにはどうすればよいですか?

http://example.com/stuff/foo_bar_blah_etc.html 

http://example.com/foo/bar/blah/etc.html 

からURLを変換しようとしていますしたがって、3つのプレースホルダを持つ単一の書き換えルールを書くことはできません。 5から6のルールを0から5のプレースホルダで作成することもできますが、より良い方法があると感じています。誰かがこれで私を助けてくれますか?

答えて

1

これを試してみてください:

RewriteRule (.*)/(.+) $1_$2 [NS] 
RewriteRule (.*) stuff/$1 [NS] 
+0

迅速な対応に感謝します。私はそれをテストするチャンスがあると、私はあなたの答えを受け入れます。 – martinatime

+0

私が最初に投稿したものはうまくいかず、恐れます。私はテストをより機能的なものにするためにそれを編集しました。 – chaos

+0

私はあなたが最初の行のフラグに[N]を使うことを意味すると思います。 – martinatime

4

私はあなたがアンダースコアで一度に一つのスラッシュを置き換えるために、これを行うことができると思う:

RewriteRule ^/(.+)/(.*?)$ /$1_$2 [N] 
RewriteRule ^.*$ /stuff$0 

[N]フラグからURL書き換え処理を再起動するようにApacheを引き起こし最初のルール。この2つの前にURLに適用される他のルールがある場合は、それらがすべての繰り返しでも呼び出されることに注意してください。

代替方法は、外部プログラムを使用して書き換えを処理する方が効率的である場合とそうでない場合があります。それはしていません(あなたは

RewriteMap slashtouscore prg:/usr/local/bin/slashtouscore.pl 
RewriteRule ^/(.*)$ /stuff${slashtouscore:$1} 

(代わりに、上記の)Apacheの設定ファイルでこれを置くだろうし、あなたが内容

#!/usr/bin/perl 
$| = 1; 
while (<>) { 
    s|/|_|g; 
    print; 
} 

で実行可能なスクリプト /usr/local/bin/slashtouscore.plを作成する必要があるだろうPerlスクリプトでなければなりません。もちろん、同じ機能を持つすべてのプログラムが行います。もちろん、ファイル名はApacheにアクセス可能であれば、どんなものでもかまいません)

これはどれもテストされていません。

+0

徹底的な答えをありがとう。 – martinatime

関連する問題