NO JAVASCRIPT

47
NO JAVASCRIPT 絶対に.js書かずに解決する 遅刻してすいません + 今電車で資料書いてきましたすいません

description

Java-ja.js #2での発表資料

Transcript of NO JAVASCRIPT

Page 1: NO JAVASCRIPT

NO JAVASCRIPT絶対に.js書かずに解決する

遅刻してすいません + 今電車で資料書いてきましたすいません

Page 2: NO JAVASCRIPT

Sho Kusano / rosylilly

ドワンゴエンジニア

最近の主な業務は生放送プロデューサー

18歳 + 髪の毛 = 2重の意味で青い

ニコニコでプレミ

アム会員になろう

Page 3: NO JAVASCRIPT

今日の話題

障害が起きました

Javascriptはもう書きたくない

なんかうまいこと解決しろ!

Page 4: NO JAVASCRIPT
Page 5: NO JAVASCRIPT

仕事やめたくなった日

Page 6: NO JAVASCRIPT

2010.10.29

ニコニコ動画(原宿)がリリース

(9)バージョンに戻せる

なんか(9)でiPadプレーヤー動かないですけど

Page 7: NO JAVASCRIPT

ありがたいユーザー様の声

Page 8: NO JAVASCRIPT

ありがたいユーザー様の声

Page 9: NO JAVASCRIPT

症状

とりあえずページ見れるは見れる

プレーヤーも表示はされてる

だけど動画もコメントもずっとロード中……

Page 10: NO JAVASCRIPT

原因

XHRがクロスドメイン通信に失敗してるわ

Access-Control-Allow-Originの設定ミスってるわ

あ、これなんか時間かかるパターンのアレだわ

Page 11: NO JAVASCRIPT
Page 12: NO JAVASCRIPT

JSでクロスドメインの仕組み

Page 13: NO JAVASCRIPT

XHR Lv2

Cookie付きでクロスドメインするには制約が

withCredentials = trueしないといけない(JS側)

Access-Control-Allow-Originに*とか指定できない(サーバー側

もちろん*.nicovideo.jpとかも書けない

Page 14: NO JAVASCRIPT

設定を見直す

Apacheの設定を見直す

Access-Control-Allow-Origin: www.nicovideo.jp

(9)バージョンはnine.nicovideo.jp

Page 15: NO JAVASCRIPT

動くわけねーわ

Page 16: NO JAVASCRIPT

安直にwww.nicovideo.jp, nine.nicovideo.jpとかしてみた

なんか動かんわ

仕様とかあんま知らんわ

Page 17: NO JAVASCRIPT

英語読みたくない

Page 18: NO JAVASCRIPT

英語読みたくない

Page 19: NO JAVASCRIPT
Page 20: NO JAVASCRIPT

できるできる詐欺

Page 21: NO JAVASCRIPT

仕様が見つかりました

XMLHttpRequest Level 2

http://www.w3.org/TR/XMLHttpRequest2/

Cross-Origin Resources Sharing

http://dev.w3.org/2006/waf/access-control/

The Web Origin Concept

http://tools.ietf.org/html/draft-abarth-origin-09

Page 22: NO JAVASCRIPT

かいつまんで

クロスドメインのリソースにアクセスするにはOriginをしっかり絞らないとクッキーは渡せないよ

Allow-Originの書き方はThe Web Origin Cenceptを見てね

こんな感じのBNFで書くよ!

Page 23: NO JAVASCRIPT

Origin Cencept

origin = "Origin:" OWS origin-list-or-null OWSorigin-list-or-null = "null" / origin-listorigin-list = serialized-origin *( SP serialized-origin )serialized-origin = scheme "://" host [ ":" port ] ; <scheme>, <host>, <port> productions from RFC3986

例:Access-Control-Allow-Origin: http://www.nicovideo.jp http://nine.nicovideo.jp

Page 24: NO JAVASCRIPT

やったー!動い

Page 25: NO JAVASCRIPT

やったー!動い

Page 26: NO JAVASCRIPT
Page 27: NO JAVASCRIPT

信じられるのは自分だけ

Page 28: NO JAVASCRIPT

仕様通りに書いたのに

なんか動かない

モダンブラウザ的には空白で複数記述とかないらしい

「別に一個指定できたらええやろ」

Page 29: NO JAVASCRIPT

あぱーっち

もう信用出来るのはApacheしかない

絶対.jsに手を入れずに解決する

Apacheのコンフィグさえあればなんとかなる

Page 30: NO JAVASCRIPT

要件整理

www.から来たらwww.、nine.からきたらnine.を許可してほしい

そのへんの振り分けはうまいことしてほしい

iPad Safariで動けばいい

Page 31: NO JAVASCRIPT

挙動をみなおす

あれ、なんかアクセス元のOriginがヘッダにある

なんかこれうまいこと使えばいけるのでは

いけるいける!

Page 32: NO JAVASCRIPT
Page 33: NO JAVASCRIPT

黒魔法3分クッキング

Page 34: NO JAVASCRIPT

きょうのレシピ

Apache : 1つ

mod_header : おおさじ2杯

mod_setenvif : こさじ1杯

Page 35: NO JAVASCRIPT

mod_header

レスポンスにヘッダが足せる皆使うアレ

Header set X-Auth trueとかやる

これでヘッダを付ける

Page 36: NO JAVASCRIPT

設定内容を可変に

なんかうまいこと変われ

Header set Access-Control-Allow-Origin “${ENV}e”

これで環境変数ENVの中身が設定される

Page 37: NO JAVASCRIPT

mod_setenvif

条件付きで環境変数をセットする

正規表現で上手にマッチするとよいのでは

やってみる

Page 38: NO JAVASCRIPT

正規表現

全部許可すると危ないからね

SetEnvIf Origin “(.*\.nicovideo\.jp)$” ORIGIN=$1

上手に入りました

Page 39: NO JAVASCRIPT

ついでに

Originとか来てない時はこのヘッダ消しとこう

無駄なヘッダは省くよー

Header set Access-Control-Allow-Origin “${ORIGIN}e” env=ORIGIN

Page 40: NO JAVASCRIPT

ということで3行書いた

でぷろい

うごけー

うごいた

Page 41: NO JAVASCRIPT

対応完了

だいたい4時間くらいかかった

解決してみればなんてこたない

あーマジ余裕だったわーマジもう起こる前から解決してたわー

Page 42: NO JAVASCRIPT
Page 43: NO JAVASCRIPT

教訓

Page 44: NO JAVASCRIPT

無理に.jsで解決しない

ぶっちゃけ4時間格闘してたのは.jsでなんとかしてたから

素直にApacheに頼ればすぐ終わった

トリッキーな手法じゃなくても解決できればよい

Page 45: NO JAVASCRIPT

仕様ちゃんと読んでもダメ

仕様とかうそつき

信用ならない

実際にどう動くかをちゃんと検証する

Page 46: NO JAVASCRIPT

諦めない

もっと楽にできるはずだという強い意志

絶対にコード書きたくないという決意

コンピューターうまいことなんとかしろという信念

Page 47: NO JAVASCRIPT

Wikipedia創設者ジミー・ウェールズからのありがとうございました

< 寄付!!