1. ホーム
  2. .htaccess

urlencoded フォワードスラッシュがURLを壊している

2023-10-05 18:07:56

質問

システムについて

私のプロジェクトではこのような形式のURLを持っています:-)

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

キーワードとクラスのペアは、quot;class" キーワードで検索することを意味します。

私は、プロジェクト内のすべてのモジュールに対して実行される共通の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 page not found エラーが発生します。 例えば、私が検索する場合 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/

これを修正するにはどうしたらいいですか?私はindex.phpをURLの中に隠しておく必要があります。そうでなければ、もしそれが必要でなければ、フォワードスラッシュの問題はなく、このURLを使うことができたでしょう。

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

どのように解決するのですか?

Apache は、すべての URL に %2F を含むすべての URL を拒否します。これはセキュリティ上の理由です。 %2F/ に起因する PATH_INFO 環境変数が自動的に URL デコードされるためです (これは馬鹿げていますが、CGI の仕様の長年の部分なのでどうすることもできません)。

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

検索URLを準備する際にurlencode()を使用しています。

を使用する必要があります。 rawurlencode() ではなく urlencode() ではなく、パス部分をエスケープするために urlencode() は名前が間違っていて、実際には application/x-www-form-urlencoded のデータ、例えばクエリ文字列や POST リクエストのボディなどに対するものであり、URL の他の部分に対するものではありません。

この違いは + はパス部分のスペースを意味しないことです。 rawurlencode() は正しく %20 を生成し、フォーム型式に符号化されたデータとURLの他の部分の両方で動作するようになります。