2012-02-21 9 views
1

私のウェブサイトのタグフィルタにファンシーURLを使用したいと思います。 URLはhttp://example.com/source/+tag1+tag2のようになります。これは、tag1とtag2でタグ付けされたすべての項目をフィルタリングする必要があります。私は、サイトのルートディレクトリに保存されている、そのために以下の書き換えルールを思い付いた:Apache rewritingがエスケープするレベルを1つ食べる(%23)

RewriteRule ^([^+]+)(\+.+)$ $1?tags=$2 [L] 

これは、すべての通常のタグ名のため正常に動作しますが、それはタグ名「C#の」のために失敗しました。ハッシュ文字はサーバーに送信されないので、タグ名はURLエンコードされ、HTMLページのリンクは次のようになります。./+c%23ターゲットページにはタグパラメータの "c"しか表示されません。 "#"の後には何も残っていません。

私は、Apacheのリライトログを有効にし、それがすでに…/+c#のような着信URL要求をログに記録することを見てきました。これにより、別のレベルのエスケープが必要と考えられるようになりました。だから実際に書き換えを成功させた%2523を試してみました。そして、文字列 "C#"全体が私のページに表示されました。

しかし、私は./?tags=c%23のようなその内部URLのページにアクセスすると、再び、それはすでにあまりにも、動作します。だから、なぜApacheが1段階のレベルで逃げ出しているのですか?それを避けるために使用できる隠し書き換えフラグはありますか?ファンシーURLを使用するには、二重にエンコードされたパブリックURLを使用する必要がありますか?それとも、あまりにも面倒だろうと私は代わりに "csharp"に私のタグの名前を変更する必要がありますか?

+0

は、私はあなたが必要だと思うhttp://httpd.apache.org/docs/current/rewrite/flags.html#flag_b(そう ' [L、B] ') – Gerben

+0

良い点ですが、うまくいかないようです。書き直しログには、「de/source/+ c#」 - >「de%2fsource%2f?tags =%2bc%23」と書き換えられ、結果のURLが見つかりません。あまりにもエスケープしています。 URLパスの他のすべての重要部分ではなく、「#」だけを再エスケープする必要があります。 – ygoe

+0

解決済み。すべての "/"エスケープを避けるために、ページのディレクトリに別の.htaccessファイルを作成する必要がありました。私はそれを受け入れることができるように答えとしてあなたのコメントを追加してください。 :) – ygoe

答えて

1

は、私はあなたが必要だと思うB flag(そう使用[L、B])

+1

これは本当に私が探していたオプションです。しかし、パス区切り文字(/)とタグ名の分離に使用するプラス文字(+)を含めて、URL文字列全体をエスケープして書き換えます。 /にエスケープされた%2Fのファイルが存在しないので、.htaccessファイルのその部分を、対象ページが置かれているディレクトリに移動する必要がありました。それから私は上の[L、B]プレフィックスだけを使って上記の書き換えルールを使うことができました。 – ygoe

関連する問題