LoginSignup
7
7

More than 5 years have passed since last update.

JavaScriptでPATH_INFOを使う

Posted at

foo/bar/bazしたい

foo.htmlというドキュメントに何らかのパラメーターを与えたい場合、foo.html?foo=barとしたり、foo.html#foo=barとしたりすることが多いが、サーバーの設定をいじるだけで(場合によりいじらなくても)foo.html/foo/barのようなアドレスでアクセスできるようになる。ユーザーから見るとディレクトリ構造が明確になってよいし、クローラーも単一のドキュメントとして扱ってくれそうだから嬉しい。

サーバーの設定

Apache 2.xではデフォルトでPATH_INFOを有効化していないみたいなので、.htaccessでAcceptPathInfo onにしとけばOK。あと.htmlがじゃまくさいときにはOptions +MultiViewsにしておく必要があるけれど、今回の本題とはちょっと違う。

.htaccess
<Files "foo.html">
    AcceptPathInfo on
</Files>

文書側の設定

今回使ったコードはこちら。

foo.hmtl
<!DOCTYPE html>
<html>
<head>
    <base href="/foo/">
    <script src="jquery.min.js"></script>
    <script>
    $(function(){
        var path_info = document.documentURI.substr(document.baseURI.length);
        path_info.match(/^[^\/]+(.*)$/);
        path_info = RegExp.$1;

        var path_name = RegExp.$1;
        $('<div>')
            .appendTo($('body'))
            .text(path_name);
    });
    </script>
</head>
<body>
    <img src="dog-1.jpg" width="100">
</body>
</html>

<base href>で指定したものはdocument.baseURIで取得できるので、document.documentURIに入っているそれ以降の文字列で、現在の文書名(foo)より後のものはPATH_INFOになる。

残念ながら、素のJavaScriptでPerl/CGIでいう$ENV{SCRIPT_NAME}は取得できないようなので、手動で<base href>するしかない模様。ただし、これが自動で取得できようがどうであろうが、最初にjquery.min.jsなどを読むときにもbaseURIが必要になってしまうので、だいぶ面倒そう。

まとめ

  1. foo.html/bar/bazもしくはfoo/bar/baz型のアドレスは作れる
  2. Apache 2.xの場合はサーバーの設定、もしくは.htaccessの設定が必要
  3. baseURIは手動入力
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7