urlencoded フォワードスラッシュがURLを壊している
質問
システムについて
私のプロジェクトではこのような形式の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の他の部分の両方で動作するようになります。
関連
-
[解決済み] .htaccessにおけるRewriteBaseの動作について
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] スペース文字をURLエンコードしています。+ または%20?
-
[解決済み] 汎用htaccessのリダイレクトwwwから非wwwへ
-
[解決済み】.htaccessで非wwwをwwwにリダイレクトする。
-
[解決済み] htaccess アクセス制御-許可-オリジン
-
[解決済み] .htaccessでファイルへのアクセスを拒否する方法
-
[解決済み] .htaccessファイルの$1 [QSA,L]は何を意味するのですか?
-
[解決済み] サブディレクトリの.htaccessパスワード保護を解除する方法
-
[解決済み] htaccess - クライアントのブラウザに強制的にキャッシュをクリアさせる方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] .htaccessにあるこのファイルは何ですか?
-
[解決済み] Access-Control-Allow-Origin複数オリジンのドメイン?
-
[解決済み] 汎用htaccessのリダイレクトwwwから非wwwへ
-
[解決済み】.htaccessで全ページを新ドメインにリダイレクトする。
-
[解決済み] .htaccess mod_rewrite - rewrite ルールからディレクトリを除外する方法
-
[解決済み] .htaccessでファイルへのアクセスを拒否する方法
-
[解決済み] .htaccess - 汎用的に "www. "を強制する方法とは?
-
[解決済み] .htaccessファイルの$1 [QSA,L]は何を意味するのですか?
-
[解決済み] HTTP URL のパス部分にあるスラッシュ ("/") は、エンコードされたスラッシュ ("%2F") と同じですか?
-
[解決済み] .htaccessでVary.Accept-Encodingヘッダーを指定する方法 .htaccessでAccept-Encodingヘッダを指定する方法