人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

.htaccess について

.htaccess には下記の様に書いてあります。

-------------------------
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?.+ /index.php
-------------------------


http://www.hoge.com/a%2Fb%2Fc

という様な「%2F」(/)の入ったURLへのアクセスも、
/index.php にリダイレクトしたいのですが、下記の様になってしまいます。

-------------------------
Not Found
The requested URL /a/b/c
-------------------------

解決方法を教えて下さい。
宜しくお願い致します。

●質問者: worldtravel
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●100ポイント ベストアンサー

『「%2F」(/)の入ったURLへのアクセスも、』というところを、素直にふたつ目のルールとして書く、というのではどうでしょうか。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?.+ /index.php [L]

RewriteCond %{REQUEST_URI} %2F [NC]
RewriteRule ^/?.+ /index.php [L]

「存在しないファイルやディレクトリだったら」の方は、RewriteRule に L フラグを指定して、条件を満たした場合にはそこで止めるようにします。


worldtravelさんのコメント
ありがとうございます。 教えて頂いた通りに試してみましたけどダメでした。 変わらず 404 のままでした。 ちなみに、下記の様にURLを決め打ちにしてもダメです。 RewriteRule ^/?a%2Fb%2Fc /index.php [L] サーバの設定によるものなのでしょうか。 (SAKURAの共用サーバです) サイトの作りとしては、/index.php 以外へのアクセスは 全て /index.php にリダイレクトする様にしたいと考えています。 「%2F」が入っていないURLは全て問題ないのですが...。

a-kuma3さんのコメント
%2F を含む URL が Rewrite のログに出てこなくて変だなーと思ってたら、こういうことらしいです。 >http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes:title> AllowEncodedSlashes ディレクティブ 説明:URL 中の符号化されたパス分離文字が先に伝えられるのを許可するかどうかを 決定する ... AllowEncodedSlashes ディレクティブは符号化された パス分離文字 (/ は %2F、さらにシステムによっては \ に対応する %5C) が存在する URL の使用を 許可するかどうかを決定します。通常は<span style="color:red;">そのような URL は 404 (Not found) エラー で拒否されます</span>。 << AllowEncodeSlashes On を httpd.conf で設定すると、%2F が / に変換されて、Rewrite モジュールに渡るようになります。 %2F だったかどうかという情報は失われますが、ファイルかディレクトリが存在するかという条件で RewriteRule を発動できるようになります。 ただ、共有サーバは .htaccess しか触れないのですよね。 ということは、このディレクティブの挙動を変更することができないので、404 になる動作は変更できないようです。 http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes

worldtravelさんのコメント
やはり、そういう仕様によって、どうしようもないという事なのですね。。。 残念ですが諦めるしかないですね。 でも理由がわかって良かったです。 ありがとうございました。

a-kuma3さんのコメント
HTML のエスケープでも、Apache の場合は %2F の扱いが特別だということが分かって、ぼくも勉強になりました。 Rewrite Module のログを見ると、ある程度は挙動が分かります(今回のは分かりませんでしたが)。 2.2 までなら、 RewriteLog と RewriteLogLevel で、2.4 なら LogLevel で出力内容を制御できます。 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

worldtravelさんのコメント
ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ