3

実際にはエンコードする必要のない括弧やアフォストロフィーなどの「予約されていない文字」であっても、文字をパーセントでエンコードする必要がある動的 URL スキームを使用する PHP アプリがあります。アプリが「間違った」方法でエンコードされたと見なした URL は正規化され、「正しい」エンコードにリダイレクトされます。

しかし、Google やその他のユーザー エージェントは、パーセント エンコーディング/デコーディングを異なる方法で正規化します。つまり、Googlebot がページをリクエストすると、「間違った」URL を要求し、「正しい」URL へのリダイレクトを返すと、Googlebot はフォローを拒否します。リダイレクトし、ページのインデックス作成を拒否します。

はい、これは弊社側のバグです。HTTP 仕様では、サーバーがパーセント エンコードされた文字とパーセント エンコードされていない未予約文字を同じように処理する必要があります。しかし、アプリ コードの問題を修正することは現時点では簡単ではないため、アプリの観点から URL が「適切に」エンコードされるようにする Apache 書き換えルールを使用して、コードの変更を回避したいと考えていました。つまり、アポップストロフィー、括弧などはすべてパーセントでエンコードされ、スペースは+ではなくとしてエンコードされ%20ます。

これは、最初のフォームを書き直して、2 番目のフォームで終了する 1 つの例です。

  • www.splunkbase.com/apps/All/4.x/Add-On/app:OPSEC+LEA+for+Check+Point+(Linux)
  • www.splunkbase.com/apps/All/4.x/Add-On/app:OPSEC+LEA+for+Check+Point+%28Linux%29

ここに別のものがあります:

  • www.splunkbase.com/apps/All/4.x/app:Benford's+Law+Fraud+Detection+アドオン
  • www.splunkbase.com/apps/All/4.x/app:Benford%27s+Law+Fraud+Detection+アドオン

ここに別のものがあります:

  • www.splunkbase.com/apps/All/4.x/app:Benford%27s%20Law%20Fraud%20Detection%20アドオン
  • www.splunkbase.com/apps/All/4.x/app:Benford%27s+Law+Fraud+Detection+アドオン

アプリがこれらの URL の 2 番目の形式のみを認識した場合、リダイレクトは送信されず、Google はページをインデックスに登録できます。

私は書き換えルールの初心者であり、mod-rewrite のドキュメントを読んだところ、mod_rewrite が自動エンコード/デコードを行っていることは明らかでした。

上記のケースを処理するための書き換えルールに関するアドバイスはありますか? 特殊文字の数は多くないので、特殊文字ごとのルールで問題ありませんが、(可能であれば) 単一のルールが理想的です。

4

2 に答える 2

2

解決策は実際にはかなり単純かもしれませんが、Bフラグを使用しているため、Apache 2.2 以降でのみ機能します。それがすべてのケースを正しく処理するかどうかはわかりません (確かに、これ以上の作業を必要としないことに少し懐疑的です)。

の値はREQUEST_URImod_rewrite 変換によって更新されないことにも注意してください。そのため、アプリケーションが要求された URL を決定するためにその値に依存している場合、行った変更はとにかく表示されません。

幸いなことに、これは .htaccess で行うことができるため、メインの構成を変更しないでおくという選択肢もあります。

RewriteEngine On

# Make sure this is only done once to avoid escaping the escapes...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# Check if we have anything to bother escaping (likely unnecessary...)
RewriteCond $0 [^\w]+
# Rewrite the entire URL by escaping the backreference
RewriteRule ^.*$ $0 [B]

Bでは、書き換えられた URL を mod_rewrite に自動的にエスケープさせる代わりに、フラグを使用する必要があるのはなぜでしょうか? mod_rewrite が URL を自動的にエスケープするとき、文字の限定されたサブセットをエスケープする関数 (何らかの理由ap_escape_uriで明らかにマクロに変換されているようです...) を使用します。ap_os_escape_pathただし、フラグは、PHPの関数をモデルにしたBと呼ばれる内部モジュール関数を使用します。escape_uriurlencode

モジュール内の の実装でescape_uriは、英数字とアンダースコアはそのまま残され、スペースは + に変換され、その他はすべてエスケープされた同等のものに変換されることが示唆されています。これはあなたが望む動作のように思われるので、おそらくうまくいくはずです。

RewriteMapそうでない場合は、受信 URL を正しい形式に操作できる外部プログラムをセットアップするオプションがあります。ただし、これにはApache構成を操作する必要があり、レネゲードスクリプトはサーバー全体に問題を引き起こす可能性があるため、回避できる場合、理想的な解決策とは考えていません.

于 2010-09-28T00:30:33.017 に答える
1

mod_rewrite は、この種の作業を行うのに最適なツールではありません。mod_rewrite を使用すると、一度に一定量のオカレンスしか置換できないためです。しかし、それは可能です:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?\ ]*)%20([^?\ ]*)
RewriteRule ^ /%1+%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?'\ ]*)'([^?'\ ]*)
RewriteRule ^ /%1\%27%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?(\ ]*)\(([^?(\ ]*)
RewriteRule ^ /%1\%28%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?)\ ]*)\)([^?)\ ]*)
RewriteRule ^ /%1\%29%2 [R=301,NE]

%20これにより、 、'(、またはが一度に1 つ置き換え)られ、301 リダイレクトで応答します。したがって、URL パスに置換が必要な 10 文字が含まれている場合、そのためには 10 回のリダイレクトが必要です。

これは最善の解決策ではない可能性があるため、Nフラグを使用して最後の内部を除くすべての置換を行い、リダイレクトを使用して外部で最後の置換のみを行うことができます。

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(([^?%\ ]|%(2[1-9a-fA-F]|[013-9][0-9a-fA-F]))*)%20(([^?%\ ]|%(2[1-9a-fA-F]|[013-9][0-9a-fA-F]))*%20[^?\ ]*)
RewriteRule ^ /%1+%4 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?\ ]*)%20([^?\ ]*)[?\ ]
RewriteRule ^ /%1+%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?'\ ]*)'([^?'\ ]*'[^?\ ]*)
RewriteRule ^ /%1\%27%2 [N,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?'\ ]*)'([^?'\ ]*)[?\ ]
RewriteRule ^ /%1\%27%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?(\ ]*)\(([^?(\ ]*\([^?\ ]*)
RewriteRule ^ /%1\%28%2 [N,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?(\ ]*)\(([^?(\ ]*)[?\ ]
RewriteRule ^ /%1\%28%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?)\ ]*)\)([^?)\ ]*\)[^?\ ]*)
RewriteRule ^ /%1\%29%2 [N,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?)\ ]*)\)([^?)\ ]*)[?\ ]
RewriteRule ^ /%1\%29%2 [R=301,NE]

ただし、Nフラグを使用すると、内部再帰カウンターがインクリメントされず、無限再帰が簡単に発生する可能性があるため、危険な場合があります。

于 2010-09-27T18:07:25.853 に答える