search/pageというページについて
このリンクをクリックすれば開けるようにしたMijikko.icon
search/pageを開くという名前のリンクやページを作ってしまうと開けなくなるかも
特徴
正攻法では開けない
古いページタイトルからのリダイレクト機能で辛うじて開くことができる
UserScriptを使っても開けない?Mijikko.icon
開けなくなった場合、削除や編集はUserScriptから行う必要がある
読むだけならScrapbox Readerを使えば可能
https://scrapbox-reader-dark.vercel.app/villagepump/search%2Fpage
既にsearch/pageが存在しているとMerge pageも機能しない
削除した後StreamからRestoreするのも何故かうまくいかない
このページの下の方に挿入されてしまう
search/pageという開けないページを生み出してしまったblu3mo.icon
どうすれば消せるんだこれ
takker.icon
code:delete.js
import { deletePage } from "/api/code/takker/scrapbox-headless-script/mod.js";
await deletePage("villagepump", "search/page");
新しい方Mijikko.icon
code:delete2.js
import { deletePage } from "https://raw.githubusercontent.com/takker99/scrapbox-userscript-std/0.17.0/browser/websocket/deletePage.ts";
await deletePage("villagepump", "search/page");
JavaScriptソースコードを生成
あとUserScriptなくても新規ページ作成でsearch/pageからのマージでいけると思うyuki_minoh.icon
むりだった。w
Failed to mergeを初めて見た
せっかくなのでかっこいいサムネをつけておいたtakker.icon
https://gyazo.com/8e0a12f22f8fd744dc974a080652cd9a
なにぃッ、、、yuki_minoh.icon
ってなった
これ、スラッシュはurlではエスケープされているから問題なく開けると思っていた
ページURL: https://scrapbox.io/villagepump/search%2Fpage
逆に検索URLが%2Fでも機能するのか
これらのURLでも検索可能
https://scrapbox.io/villagepump/search%2Fpage?q=test
https://scrapbox.io/villagepump%2Fsearch%2Fpage?q=test
これだとだめ
https://scrapbox.io%2Fvillagepump%2Fsearch%2Fpage?q=test
%2Fをスラッシュに変換しているのはブラウザではなくScrapbox側ってことかblu3mo.icon
すごwyuki_minoh.icon
どうやって作ったのか気になる
新規ページのタイトルを普通にsearch/pageにすれば作れますblu3mo.icon
まじかよwyuki_minoh.icon
search/page?q=searchをつくってみたがこれはむりだった
へーって感じ
開けたblu3mo.icon*3
https://scrapbox.io/villagepump/search
これを開くとなぜかsearchというタイトルのページではなくsearch/pageにリダイレクトされるblu3mo.icon
へーyuki_minoh.icon
再現に失敗しているんだが
search/pageというページについて#61c457e079e1130000212ba6ではない状況でですか..?blu3mo.icon
search/pageしか作っていないプロジェクト1件とどちらも作っていないプロジェクト2件の両方で試したyuki_minoh.icon
コードを読んでいても起こりそうにない不思議な挙動なのでサーバー側でやってんのかなと思って再現しようとしたらだめだった
古いページから新しいページへのリダイレクトを調べてみたら、サーバーから302が返却されることによるリダイレクトなので、普段頻繁に目にするJavaScriptによるルーティングとは質が違う
普段よくやるリンクのクリックとかは、Scrapboxでは全部JavaScriptが担当しているので挙動をしらべることができる
これによってsearch/pageのガードを突破できたのだと思う
(追記)あれ、出来なくなった...w
起きた事
1. 元々は、
https://scrapbox.io/villagepump/search を開くと、タイトルsearch/pageのページが表示される
不思議な挙動ではある
2. しかし、一度タイトルsearchのページを作成すると、
https://scrapbox.io/villagepump/search を開くと、タイトルsearchのページが表示される
挙動が変化した
というかこれが当たり前の挙動ではある
3. その後、タイトルsearchのページを削除しても、
https://scrapbox.io/villagepump/search を開くと、タイトルsearchのページが表示される挙動が維持される
とても不思議blu3mo.icon*2
これは複数プロジェクトで再現できたblu3mo.icon
つまり、「一度も作られた事がないページ」と「一度作られてから削除されたページ」で挙動に違いがあるという事
古いページから新しいページへのリダイレクトするために、作られたことがあるページを記録している?yosider.icon
これならあり得るtakker.icon
1. blu3mo.iconさんがsearch/pageを作ろうとして、新規ページをひらきsearchまでタイトル欄に書き込む
2. この状態で誰かがsearchにアクセスする
3. blu3mo.iconさんがsearch/pageまで入力し終える
井戸端と/blu3moの両方でsearch/pageというページについて#61c457fa79e1130000212baeが再現できたので、違う気がしますblu3mo.icon
/shokai/wikiでページのURLをIDにすると絶対にうまくいかない#596f712f97c2910000c3ab7c
↑これでは?Mijikko.icon
古いページタイトルからのリダイレクト機能
yuki_minoh.iconの解釈
どうしても再現できないので不思議に思い、深掘りしてしらべたので報告しておく
メカニズムはおそらく古いページから新しいページへのリダイレクトなのは間違いない
まず、ブラウザ系統の通常のアクセスならJavaScriptによるホーム画面へのルーティングを突破できない
これを突破できるのはおそさくサーバー側での302リダイレクトのみ
状況証拠として、古いページから新しいページへのリダイレクトでは302リダイレクトが発生することを確認した
また、JavaScriptには、/:projectName/searchを/:projectName/search/pageにルーティングするような設定は見当たらない
つまり古いページから新しいページへのリダイレクトがsearchとsearch/pageの間で起こったとみるべき
ただし、本当はどのような編集が行われていたのかはわからない
yuki_minoh.iconの調査によると、改名前の記事名に対して「作成後、かつ改名前」にアクセスされなければリダイレクトが設定されない
つまりsearch/pageの以前の名称はsearchだった
そのうえ、改名される前で、しかも記事が作成されたあとに、ブラウザリロードなど何かしらのアクセスがあった
こう考えればつじつまがあうと考えている
で、今実際にやってみて、やっと再現できた
というわけでいい推理だったのではと考えている
それでもって、アクセスできなくてもAPIは叩けるわけなんで、編集履歴を追ってみたよ
https://gyazo.com/9804807203b16d1fc9cd3dae5a503937/raw#.png
初期はsearchだったことがこれではっきりしたね
なるほどblu3mo.icon*2
code:js
(async () => {
const id = (await (await fetch("/api/pages/villagepump/search%2Fpage")).json()).id;
console.log(id);
const data = (await (await fetch("/api/commits/villagepump/"+id)).json()).commits.flatMap(({changes}) => changes);
console.table(data);
})();
他にもありそうblu3mo.icon