SlideShare a Scribd company logo
@Hiraku
(中野 拓)
   @Hiraku (中野 拓)
    ◦ PHP歴5年ぐらい

    ◦ Zend Framework, Yaf

    ◦ http://blog.tojiru.net/
    ◦ https://github.com/hirak
URL設計の話
   http://example.com/index.php?action=hoge
    とかだとダサい

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

   しかし短すぎると
    将来の拡張性が…
   SEO対策がどうとか
仕様を読みましょう
他にもURLに関するRFC
                         があるけど、これが最新




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


http://www.studyinghttp.net/rfc_ja/rfc3986
(橋本英彦氏による日本語訳)
{scheme}:{authority}{path}?{query}#{fragment}

http://example.com/a/b/c.php?q=v#foo
{scheme}:{authority}{path}?{query}#{fragment}

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

固定       ドメイン                  パラメータ的な使い方
        考えるだけ




                    ???
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 / ":" / "@
   使ってよい文字
    ◦ 非予約文字(unreserved-character)
     [0-9A-Za-z._~-]

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

    ◦ 予約文字のうちのsub-delims
     [!$&'()*+,;=]

    ◦ 予約文字のうちのgen-delimsの一部
     [@/:]
0 1 2 3 4 5 6 7 8 9
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
. _ ~ -
! $ & ' ( ) * + , ; =
@ / :
URLに使える文字は
英数字と / だけ
ではない!!
デモ
0 1 2 3 4 5 6 7 8 9
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
. _ ~ -
! $ & ' ( ) * + , ; =
@ / :

            四則演算
           できるよね
   http://calc.tojiru.net/1+2
   http://calc.tojiru.net/2-1
   http://calc.tojiru.net/(1+2)*10/2

   URLとして妥当

   リクエストすると計算結果がtext/plainで返って
    くる
0 1 2 3 4 5 6 7 8 9
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
. _ ~ -
! $ & ' ( ) * + , ; =
@ / :

            PHP!?
   /$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

   ローカルで実験しましょうね
   スペースが書けないのでclassやfunctionが無理
   echoは()が必要になる
   []が書けないので添え字アクセスも無理
   "も書けない

   できないところも多い
実践的な話
   縛りプレイ
    ◦ 使っている文字が少なすぎる

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

    ◦ /は「階層」の意味合いを感じてしまう
   /map/lat/50/long/20/scale/32000
   こういうURL設計を強要するフレームワーク、
    よくあるよね

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

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

    ◦ 入れ替え可能だし階層っぽさは消えた
   Tim Berners-Leeによる提案
    http://www.w3.org/DesignIssues/MatrixURIs.html

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

    ◦ セミコロンによるqueryと同等の記述
    ◦ queryを使っていないところに意味がある
   /user;id=123/friends

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

    ◦ パスの途中にパラメータを仕込む構文が可能
      →覚えておくと何かと便利
まとめ
   URLの記述力はすごい

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

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

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

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

More Related Content

PDF
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor Skochinsky
PPTX
本当は恐ろしい分散システムの話
PDF
基礎線形代数講座
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
Keycloak拡張入門
PDF
Unified JVM Logging
PDF
OAuth 2.0のResource Serverの作り方
PDF
ドメイン駆動設計 コアドメインを語り合ってみよう
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor Skochinsky
本当は恐ろしい分散システムの話
基礎線形代数講座
SPAセキュリティ入門~PHP Conference Japan 2021
Keycloak拡張入門
Unified JVM Logging
OAuth 2.0のResource Serverの作り方
ドメイン駆動設計 コアドメインを語り合ってみよう

What's hot (20)

PPTX
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
PPTX
MongoDBが遅いときの切り分け方法
PDF
分散型IDと検証可能なアイデンティティ技術概要
PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
PDF
TDD のこころ @ OSH2014
PPTX
差分プライバシーとは何か? (定義 & 解釈編)
PPTX
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
PDF
明日使えないすごいビット演算
PDF
初心者向けCTFのWeb分野の強化法
PPTX
コンテナネットワーキング(CNI)最前線
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
PPT
技術勉強会(楕円曲線暗号)資料
PDF
世界でいちばんわかりやすいドメイン駆動設計
PPTX
法人認証基盤GビズIDと今後の法人KYC - OpenID BizDay #14
PDF
イミュータブルデータモデルの極意
PDF
GoによるWebアプリ開発のキホン
PPTX
BuildKitによる高速でセキュアなイメージビルド
PPTX
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
MongoDBが遅いときの切り分け方法
分散型IDと検証可能なアイデンティティ技術概要
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
TDD のこころ @ OSH2014
差分プライバシーとは何か? (定義 & 解釈編)
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
明日使えないすごいビット演算
初心者向けCTFのWeb分野の強化法
コンテナネットワーキング(CNI)最前線
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
技術勉強会(楕円曲線暗号)資料
世界でいちばんわかりやすいドメイン駆動設計
法人認証基盤GビズIDと今後の法人KYC - OpenID BizDay #14
イミュータブルデータモデルの極意
GoによるWebアプリ開発のキホン
BuildKitによる高速でセキュアなイメージビルド
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
Ad

Viewers also liked (20)

PDF
南海大餐pdf
PDF
Notafilia moedas comunitárias de portugal
PPT
依納五穗種子-公民記者分享-中部聚會
PPT
ellenlee-公民記者分享-中部聚會
PPTX
nature23-公民記者分享-中部聚會
XLS
Hrd recruitment track report no3_book1(1)
PPS
盧廣《中國的污染》
PPTX
Harsh Climate for Human Rights Defenders in China:2014 in Photos 中国大陆人权捍卫者面临严...
PDF
what it means for PKP to offer Article Level Metrics
DOCX
08级第七批警务援助队绵竹教学实践活动自我鉴定报告
PDF
Redmine 260 300_new_feature
PPTX
CHRD’s image gallery of the year in human rights defense in China
PPTX
PPTX
Final slideshow hrd 2013 report
PDF
It from bit
PDF
「通貨と持続可能性: 見失われた関連性」要約
PPTX
China, Law and the Foreigner: Mutual Engagements on a Global Stage
PPT
Recruitment -hrd 2 report (1)
PPTX
Enterprise grade firewall and ssl termination to ac by will stevens
南海大餐pdf
Notafilia moedas comunitárias de portugal
依納五穗種子-公民記者分享-中部聚會
ellenlee-公民記者分享-中部聚會
nature23-公民記者分享-中部聚會
Hrd recruitment track report no3_book1(1)
盧廣《中國的污染》
Harsh Climate for Human Rights Defenders in China:2014 in Photos 中国大陆人权捍卫者面临严...
what it means for PKP to offer Article Level Metrics
08级第七批警务援助队绵竹教学实践活动自我鉴定报告
Redmine 260 300_new_feature
CHRD’s image gallery of the year in human rights defense in China
Final slideshow hrd 2013 report
It from bit
「通貨と持続可能性: 見失われた関連性」要約
China, Law and the Foreigner: Mutual Engagements on a Global Stage
Recruitment -hrd 2 report (1)
Enterprise grade firewall and ssl termination to ac by will stevens
Ad

Similar to URLで遊ぼう (20)

PDF
良いUrlを設計する
PDF
RESTとRailsスタイル
PPT
OSC2008 Tokyo/Spring REST勉強夜会
PPT
Cubby 2008-09-06
KEY
FuelPHPをさわってみて
PPT
CakePHPで開発する時に統一しておきたいコーディング内容(080316)
PDF
エコなWebサーバー
PDF
デザイナー向け 初めてのPhp ~サイト制作に役立つtips~
PDF
RESTful #とは RailsスタイルからRESTを学ぼう
KEY
Mojoliciousをウェブ制作現場で使ってみてる
PDF
お前は PHP の歴史的な理由の数を覚えているのか
PDF
長いの
PDF
RESTful Web アプリの設計レビューの話
PDF
FukuokaPHP 3
PDF
レンタルサーバで今すぐ始めるWEB開発
PDF
Web programming introduction
PDF
Rest ful api設計入門
PDF
Beginning Java EE 6 勉強会(7) #bje_study
PDF
WebAPIではじめるphp入門
PDF
第1回マッシュアップワークショップ
良いUrlを設計する
RESTとRailsスタイル
OSC2008 Tokyo/Spring REST勉強夜会
Cubby 2008-09-06
FuelPHPをさわってみて
CakePHPで開発する時に統一しておきたいコーディング内容(080316)
エコなWebサーバー
デザイナー向け 初めてのPhp ~サイト制作に役立つtips~
RESTful #とは RailsスタイルからRESTを学ぼう
Mojoliciousをウェブ制作現場で使ってみてる
お前は PHP の歴史的な理由の数を覚えているのか
長いの
RESTful Web アプリの設計レビューの話
FukuokaPHP 3
レンタルサーバで今すぐ始めるWEB開発
Web programming introduction
Rest ful api設計入門
Beginning Java EE 6 勉強会(7) #bje_study
WebAPIではじめるphp入門
第1回マッシュアップワークショップ

More from Hiraku Nakano (9)

PDF
composer-scriptsについて
PDF
composerの遅さをまじめに考える #phpstudy
PDF
Composer並列化プラグイン #phpblt
PDF
Scrutinizer CIでPHPも静的解析 #phpstudy
PDF
JSON SchemaとPHP
PDF
こわくない同時実行制御
PDF
PSR-3 Logger Interfaceの紹介
PPTX
pecl-AOPの紹介
PPTX
Xml builderの紹介
composer-scriptsについて
composerの遅さをまじめに考える #phpstudy
Composer並列化プラグイン #phpblt
Scrutinizer CIでPHPも静的解析 #phpstudy
JSON SchemaとPHP
こわくない同時実行制御
PSR-3 Logger Interfaceの紹介
pecl-AOPの紹介
Xml builderの紹介

URLで遊ぼう

  • 2. @Hiraku (中野 拓) ◦ PHP歴5年ぐらい ◦ Zend Framework, Yaf ◦ http://blog.tojiru.net/ ◦ https://github.com/hirak
  • 4. http://example.com/index.php?action=hoge とかだとダサい  短くてCoolなURLにしたい http://twitter.com/Hiraku  しかし短すぎると 将来の拡張性が…  SEO対策がどうとか
  • 6. 他にもURLに関するRFC があるけど、これが最新 RFC3986 http://www.ietf.org/rfc/rfc3986.txt http://www.studyinghttp.net/rfc_ja/rfc3986 (橋本英彦氏による日本語訳)
  • 9. 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 / ":" / "@
  • 10. 使ってよい文字 ◦ 非予約文字(unreserved-character) [0-9A-Za-z._~-] ◦ %エンコードされた文字 ◦ 予約文字のうちのsub-delims [!$&'()*+,;=] ◦ 予約文字のうちのgen-delimsの一部 [@/:]
  • 11. 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz . _ ~ - ! $ & ' ( ) * + , ; = @ / :
  • 14. 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz . _ ~ - ! $ & ' ( ) * + , ; = @ / : 四則演算 できるよね
  • 15. http://calc.tojiru.net/1+2  http://calc.tojiru.net/2-1  http://calc.tojiru.net/(1+2)*10/2  URLとして妥当  リクエストすると計算結果がtext/plainで返って くる
  • 16. 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz . _ ~ - ! $ & ' ( ) * + , ; = @ / : PHP!?
  • 17. /$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  ローカルで実験しましょうね
  • 18. スペースが書けないのでclassやfunctionが無理  echoは()が必要になる  []が書けないので添え字アクセスも無理  "も書けない  できないところも多い
  • 20. 縛りプレイ ◦ 使っている文字が少なすぎる ◦ /と[0-9A-Za-z._-]だけでURL作るとか厳しい ◦ /は「階層」の意味合いを感じてしまう
  • 21. /map/lat/50/long/20/scale/32000  こういうURL設計を強要するフレームワーク、 よくあるよね ◦ lat(経度)とlong(緯度)は階層じゃない ◦ lat/50とlong/20を入れ替えても動作する方がいい  /map?lat=50&long=20&scale=32000 ◦ 入れ替え可能だし階層っぽさは消えた
  • 22. Tim Berners-Leeによる提案 http://www.w3.org/DesignIssues/MatrixURIs.html  /map;lat=50;long=20;scale=32000 ◦ セミコロンによるqueryと同等の記述 ◦ queryを使っていないところに意味がある
  • 23. /user;id=123/friends ◦ 後ろに階層を続けることができる ◦ クエリはURL中一度しか使えないので、 Matrix URIの方が拡張性高い ◦ パスの途中にパラメータを仕込む構文が可能 →覚えておくと何かと便利
  • 25. URLの記述力はすごい  "/" 以外のsub-delimsを使えば世界が広がる  みんなもっとURLで遊べばいい
  • 26. 別に「URL設計はこうあるべき」とか論じる気は ない ◦ そんなのサービスによって変わるし  その前に選択肢を知るべきだ  自分で制限して自分で苦しむなんて、バカみたい じゃないか