74

システムについて

プロジェクトにこの形式の URL があります:-

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0

キーワード/クラスのペアは、「クラス」キーワードで検索することを意味します。

プロジェクト内のすべてのモジュールに対して実行される共通の index.php ファイルがあります。URL から index.php を削除するための書き換えルールのみがあります:-

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

検索 URL の準備中に urlencode() を使用し、検索 URL の読み取り中に urldecode() を使用しています。

問題

スラッシュ文字のみが URL を分割し、404 ページが見つからないというエラーが発生します。たとえばone/two、URLを検索すると

http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/

これを修正するにはどうすればよいですか? URL に index.php を隠しておく必要があります。それ以外の場合、それが必要ない場合は、スラッシュに問題はなく、次の URL を使用できたはずです:-

http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one
%2Ftwo/new_search/1/search_exam/0/search_subject/0
4

13 に答える 13

150

Apache は、セキュリティ上の理由から、パス部分に を含むすべての URL を拒否します。環境変数が自動的に URL デコードされるため、スクリプトは通常 (つまり、書き換えなしで)と%2Fの違いを伝えることができません(これはばかげていますが、長年にわたってCGI 仕様の一部であるため、これについては何もできません)。%2F/PATH_INFO

ディレクティブを使用してこの機能をオフにすることができますAllowEncodedSlashesが、他の Web サーバーは引き続きそれを許可しないことに注意してください (オフにするオプションはありません)。他の文字もタブーである可能性があり (例: %5C)、%00特に常にApache と IIS の両方によってブロックされます。したがって、アプリケーションが%2Fパス部分に または他の文字を使用できることに依存している場合、互換性/展開オプションが制限されます。

検索 URL の準備中に urlencode() を使用しています

パス部分をエスケープするためrawurlencode()ではなく、を使用する必要があります。実際にはクエリ文字列や POST リクエストの本文などのデータ用であり、URL の他の部分用ではありません。urlencode()urlencode()application/x-www-form-urlencoded

違いは+、パス部分のスペースを意味しないことです。rawurlencode()代わりに正しく生成%20され、フォーム エンコードされたデータと URL の他の部分の両方で機能します。

于 2010-07-13T08:26:24.277 に答える
5

Apache では、AllowEncodedSlashes On は、リクエストが 404 で即座に拒否されるのを防ぎます。

これを修正する方法に関する別のアイデア。

于 2011-04-28T09:27:52.847 に答える
4
$encoded_url = str_replace('%2F', '/', urlencode($url));
于 2014-03-12T01:23:52.013 に答える
2

私のホスティング アカウントでは、この問題は、すべてのアカウントに自動的に設定された ModSecurity ルールが原因でした。この問題を報告すると、管理者はすぐに私のアカウントからこのルールを削除しました。

于 2011-05-17T18:03:37.530 に答える
1

別の文字を使用し、サーバー側のスラッシュを置き換えます

たとえば、Drupal.org は %21 (感嘆符文字 !) を使用して、url パラメーターのスラッシュを表します。

以下のリンクは両方とも機能します。

https://api.drupal.org/api/drupal/includes%21common.inc/7

https://api.drupal.org/api/drupal/includes!common.inc/7

キャラクターがパラメーター内のキャラクターと衝突することが心配な場合は、キャラクターの組み合わせを使用してください。

したがって、URL は http://project_name/browse_by_exam/type/tutor_search/keyword/one_-!two/new_search/1/search_exam/0/search_subject/0 になります。

js で変更し、スラッシュ サーバー側に変換します。

于 2015-09-02T15:49:45.623 に答える
0

この問題の標準的な解決策は、スラッシュを含む可能性のあるパラメーターを URL の最後のパラメーターにすることで、スラッシュを許可することです。

製品コードの URL の場合、次のようになります...

mysite.com/product/details/PR12345/22

あなたが持っている検索語について

http://project/search_exam/0/search_subject/0/keyword/Psychology/Management

(ここでのキーワードは心理学・経営)

最初の「名前付き」パラメーターを処理してから、残りのパラメーターを連結して製品コードまたはキーワードにするのは、大した作業ではありません。

一部のフレームワークでは、ルーティング定義にこの機能が組み込まれています。

これは、スラッシュを含む 2 つのパラメーターを含むユース ケースには適用されません。

于 2014-11-07T11:51:20.080 に答える
-1

httpアドレスではなく文字として表示されるスラッシュを含むURL部分にjavascriptのencodeURI()関数を使用します。例えば:

"/api/activites/" + encodeURI("?categorie=assemblage&nom=Manipulation/Finition")

http://www.w3schools.com/tags/ref_urlencode.aspを参照してください。

于 2015-04-22T17:21:35.283 に答える
-3

%2Fこのように使用する場合は、次のように使用できます。
?param1=value1&param2=value%2Fvalue

しかし、それを使用/param1=value1/param2=value%2Fvalueするとエラーがスローされます。

于 2011-11-20T15:01:39.677 に答える