26
URL でででで @Hiraku ( 中中 中 )

URLで遊ぼう

Embed Size (px)

DESCRIPTION

第62回PHP勉強会で発表した内容です

Citation preview

Page 1: URLで遊ぼう

URL で遊ぼう@Hiraku

( 中野 拓 )

Page 2: URLで遊ぼう

@Hiraku ( 中野 拓 )◦ PHP 歴 5 年ぐらい

◦ Zend Framework, Yaf

◦ http://blog.tojiru.net/◦ https://github.com/hirak

自己紹介

Page 3: URLで遊ぼう

URL 設計の話

Page 4: URLで遊ぼう

URL 設計悩むよね http://example.com/index.php?action=hoge

とかだとダサい

短くて Cool な URL にしたいhttp://twitter.com/Hiraku

しかし短すぎると将来の拡張性が…

SEO 対策がどうとか

Page 5: URLで遊ぼう

仕様を読みましょう

Page 6: URLで遊ぼう

RFC3986

他にも URL に関するRFC があるけど、これが

最新

http://www.ietf.org/rfc/rfc3986.txt

http://www.studyinghttp.net/rfc_ja/rfc3986( 橋本英彦氏による日本語訳 )

Page 7: URLで遊ぼう

{scheme}:{authority}{path}?{query}#{fragment}

http://example.com/a/b/c.php?q=v#foo

URI(URL) の構造

Page 8: URLで遊ぼう

{scheme}:{authority}{path}?{query}#{fragment}

http://example.com/a/b/c.php?q=v#foo

悩むのはパス

固定 ドメイン考えるだけ

パラメータ的な使い方

???

Page 9: URLで遊ぼう

パスの仕様を読む (Sec 3.3) path = path-abempty ; "/" で始まるか、空 / path-absolute ; "/" で始まるが、 "//" では始まらない / path-noscheme ; コロンの無い segment で始まる / path-rootless ; segment で始まる / path-empty ; 文字が無い

path-abempty = *( "/" segment ) path-absolute = "/" [ segment-nz *( "/" segment ) ] path-noscheme = segment-nz-nc *( "/" segment ) path-rootless = segment-nz *( "/" segment ) path-empty = 0<pchar>

segment = *pchar segment-nz = 1*pchar segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) ; non-zero-length segment without any colon ":"

pchar = unreserved / pct-encoded / sub-delims / ":" / "@

Page 10: URLで遊ぼう

使ってよい文字◦ 非予約文字 (unreserved-character)

[0-9A-Za-z._~-]

◦ % エンコードされた文字

◦ 予約文字のうちの sub-delims

[!$&'()*+,;=]

◦ 予約文字のうちの gen-delims の一部

[@/:]

超要約

Page 11: URLで遊ぼう

0 1 2 3 4 5 6 7 8 9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. _ ~ -! $ & ' ( ) * + , ; =@ / :

超要約

Page 12: URLで遊ぼう

声を大にして言いたい

URL に使える文字は英数字と / だけではない!!

Page 13: URLで遊ぼう

デモ

Page 14: URLで遊ぼう

デモ1

0 1 2 3 4 5 6 7 8 9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. _ ~ -! $ & ' ( ) * + , ; =@ / :

四則演算できるよね

Page 15: URLで遊ぼう

http://calc.tojiru.net/1+2 http://calc.tojiru.net/2-1 http://calc.tojiru.net/(1+2)*10/2

URL として妥当

リクエストすると計算結果が text/plain で返ってくる

デモ 1 電卓 API

Page 16: URLで遊ぼう

デモ 2

0 1 2 3 4 5 6 7 8 9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. _ ~ -! $ & ' ( ) * + , ; =@ / :

PHP !?

Page 17: URLで遊ぼう

/$a=1;$b=2;echo($a+$b); /$a=array(1,2,3);echo(implode(':',$a));

<?php$code = ltrim($_SERVER['REQUEST_URI'], '/');eval($code);

$ php -S localhost:8080 index.php

ローカルで実験しましょうね

デモ 2 PHP も一部書ける

Page 18: URLで遊ぼう

スペースが書けないので class や function が無理

echo は () が必要になる [] が書けないので添え字アクセスも無理 " も書けない

できないところも多い

デモ 2 PHP も一部書ける

Page 19: URLで遊ぼう

実践的な話

Page 20: URLで遊ぼう

縛りプレイ◦ 使っている文字が少なすぎる

◦ / と [0-9A-Za-z._-] だけで URL 作るとか厳しい

◦ / は「階層」の意味合いを感じてしまう

URL 設計が難しい理由

Page 21: URLで遊ぼう

/map/lat/50/long/20/scale/32000 こういう URL 設計を強要するフレームワーク、

よくあるよね

◦ lat( 経度 ) と long( 緯度 ) は階層じゃない◦ lat/50 と long/20 を入れ替えても動作する方がいい

/map?lat=50&long=20&scale=32000

◦ 入れ替え可能だし階層っぽさは消えた

例)地図の URL を考える

Page 22: URLで遊ぼう

Tim Berners-Lee による提案http://www.w3.org/DesignIssues/MatrixURIs.html

/map;lat=50;long=20;scale=32000

◦ セミコロンによる query と同等の記述◦ query を使っていないところに意味がある

Matrix URI

Page 23: URLで遊ぼう

/user;id=123/friends

◦ 後ろに階層を続けることができる◦ クエリは URL 中一度しか使えないので、

Matrix URI の方が拡張性高い

◦ パスの途中にパラメータを仕込む構文が可能→覚えておくと何かと便利

Matrix URI のメリット

Page 24: URLで遊ぼう

まとめ

Page 25: URLで遊ぼう

URL の記述力はすごい

"/" 以外の sub-delims を使えば世界が広がる

みんなもっと URL で遊べばいい

まとめ

Page 26: URLで遊ぼう

別に「 URL 設計はこうあるべき」とか論じる気はない◦ そんなのサービスによって変わるし

その前に選択肢を知るべきだ

自分で制限して自分で苦しむなんて、バカみたいじゃないか

言いたかったこと