.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
-------------------------

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

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/08/09 00:13:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

『「%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 フラグを指定して、条件を満たした場合にはそこで止めるようにします。

他3件のコメントを見る
id: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

2016/08/09 00:31:41
id:worldtravel

ありがとうございます。

2016/08/12 23:58:26
  • id:jwrekitan
    > サイトの作りとしては、/index.php 以外へのアクセスは

    え?…

    # RewriteCond %{REQUEST_FILENAME} !-f ←ファイルが存在しない場合に実行
    # RewriteCond %{REQUEST_FILENAME} !-d ←ディレクトリが存在しない場合に実行

    という事を指定されていたので404関連の記述かと思ったのですが^^;

    .htaccess、トップ以外のアクセスをトップにリダイレクトする方法
    http://highmoon-miyabi.main.jp/blog/2013/05/31_000339.html

    というそのものずばりのページがありましたのでご報告致します。
  • id:jwrekitan
    (追記)もし上記でも404を回避できないようなら、

    ErrorDocument 404 /index.php

    を付け加えることで事足りるような気がしないでもないです。
    http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/redirect.html
  • id:a-kuma3
    随分とお久しぶりな感じが >椶櫚さん

    「そのものずばりのページ」は、いくつかの理由(*)で話 1/4 くらいで読んでおけば良いような感じですが、404 のページを index.php にするというのは、質問の目的にかなってそうな気がします。

    (*) (ぼくが)真剣に読む気にならない、いくつかの理由
    - 基本的なところで、正規表現が分かってない
    - 「いろいろとやってみた」と書いてあって、具体例がない
      → こういう表現は、試行回数は多いのかもしれないが、行き当たりばったりなので、同じようなことを繰り返しているだけだということが多い
    - ログを見ない人(少なくとも、ループしてる理由は一発で分かる)
    - 多分、マニュアルも見ない人

  • id:jwrekitan
    どもども、ご無沙汰しております^^;
    以前ほど時間が割けないので、ほどほどに出現する感じになろうかと思います。
  • id:worldtravel
    椶櫚さん、ありがとうございます。

    ダメでした...。

    > ErrorDocument 404 /index.php

    そういえば、昔、どんなURLだろうとindex.php で処理したいときに
    これを自分のサイトでやっておりましたので、

    そうだ、これで解決だ!、、、と喜んで追記しましたが、結果は変わりませんでした。ーー;;


    「%2F」を含んでいないURLは全てindex.phpに行きますが、
    含んでいると、変わらず「404 Not Found」でした。

    どこに書いても同じでした。



    > # RewriteCond %{REQUEST_FILENAME} !-f ←ファイルが存在しない場合に実行
    > # RewriteCond %{REQUEST_FILENAME} !-d ←ディレクトリが存在しない場合に実行

    はい、条件通り、存在しないURLは全て index.php にリダイレクトしています。
    URLを動的に生成しているサイトでして、
    一部のURLはそのURLで処理しているので、存在しない場合は、としております。

    全部index.phpに飛ばして、存在しないはずのURLを指定された場合は
    404を表示する様にしております。



    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません