私のウェブサイトのタグフィルタにファンシー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"に私のタグの名前を変更する必要がありますか?
は、私はあなたが必要だと思うhttp://httpd.apache.org/docs/current/rewrite/flags.html#flag_b(そう ' [L、B] ') – Gerben
良い点ですが、うまくいかないようです。書き直しログには、「de/source/+ c#」 - >「de%2fsource%2f?tags =%2bc%23」と書き換えられ、結果のURLが見つかりません。あまりにもエスケープしています。 URLパスの他のすべての重要部分ではなく、「#」だけを再エスケープする必要があります。 – ygoe
解決済み。すべての "/"エスケープを避けるために、ページのディレクトリに別の.htaccessファイルを作成する必要がありました。私はそれを受け入れることができるように答えとしてあなたのコメントを追加してください。 :) – ygoe