オレオレブログテスト

https://www.dobusarai.net/blog-test/

まだページャーとかカテゴリリンクとか全然だけど。モチベーション保てないので少しづつでも上げたりなんだりしていくことに。

pagespeedinsight-score100

google tag manager貼ってないから100点なんだけどね。ぶっちゃけ解析なんてしたことないのだが、前職であのタグ(js読み込み)前提で高速化していたので……。

/*なぜかコードブロックを入れないとindexなどの記事複数表示画面でcssを読み込まない。なんか変えちゃったっぽいけど面倒なのでとりあえず

[go] オレオレblogのRouter’

前回まで

  1. blogのURLどうしようかなこれ
  2. [c#] オレオレblogのRouter
  3. [go] オレオレblogのRouter

というわけでGo版その2。ginが目的を果たせないようなので、次にメジャーなechoを試した。デファクトスタンダードだとしても、個人的に全部入り鈍重FWは大嫌いなので採用しないのだけど、ベンチマーク的にはechoの方が速いらしい。こっちに決まりかな!

echoだけ

package main

import (
    "net/http"

    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "index")
    })
    e.GET("/:entry_code", func(c echo.Context) error {
        return c.String(http.StatusOK, "entry"+c.Param("entry_code"))
    })
    e.GET("/page/:num", func(c echo.Context) error {
        return c.String(http.StatusOK, "list"+c.Param("num"))
    })
    e.GET("/category/:category_code", func(c echo.Context) error {
        return c.String(http.StatusOK, "category"+c.Param("category_code"))
    })
    e.GET("/category/:category_code/page/:num", func(c echo.Context) error {
        return c.String(http.StatusOK, "category"+c.Param("category_code")+c.Param("num"))
    })
    e.Logger.Fatal(e.Start(":9009"))
}

あまり書くこともないのだけど、とりあえず目的は達した。"/"と"/:hoge"で挙動が違うところはASP.netともまた違うね。いろんなパス入れてreloadしてて思ったけど、中身は単純に/でsplitしてそうだよね。どのFWも。

ASP.netが超絶楽ちん、かつ個人的にc#より最高(環境とか含めて)な言語は無いと思ってるのだけど、goを勉強したいのでこれにしようかな。まー、趣味であれこれやっても、仕事でやるのと比較すると習熟度が全然違うんだけどね。

blogのURLどうしようかなこれ

そういえば

WordPressの投稿データを抜き出して云々をやっていて気づいたのだが、URLそのままにオレオレblogシステムを作る場合にRouter周りはどうやって実装すればいいんだ?と。

WAFのRouter

通常、というか俺の知る限りだとbootstrapファイルにリクエストを集約させて、リクエストURIから分岐して云々がデフォだ。MVCではないWordPressでも同じ。例えばPHPのPhalconではnginxの設定に下記記述をする。

    # Represents the root of the domain
    # https://localhost:8000/[index.php]
    location / {
        # Matches URLS `$_GET['_url']`
        try_files $uri $uri/ /index.php?_url=$uri&$args;
    }

Phalcon Documentation - Web Server Setup

そのリクエストに対してFWのコアでゴニョゴニョやって、下記のようなURLパターンで処理を分岐させ実行している。

/<Contoroler>/<Function>/<Param>

ASP.netの場合、MVCテンプレートを作るとStartup.csには自動で下記のようなコードが生成される。

            app.UseEndpoints(endpoints => {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });

Go(Gin)の場合は、この間作ったメールフォームのを引用するとこんなん。

const (
    IndexPath    = "/contact/"
    ConfirmPath  = IndexPath + "confirm"
    CompletePath = IndexPath + "complete"

    /* ----- 省略 ----- */

    // action
    engine.GET(IndexPath, index)
    engine.POST(ConfirmPath, confirm)
    engine.POST(CompletePath, complete)
    // 404
    engine.NoRoute(notFound)

で、

WordPressにはdefaultでcategoryなどがあるので、Frontend側はIndex, Categoryの2つのコントローラでいいよなーと何の疑問もなく考えていた。(コメントとか検索とかは全く不要なので)

自分のblogのパーマネントリンク設定なんて忘れていたのだ。

wp-permalink

前回のエントリ記事のURLは https://www.dobusarai.net/blog/omaera-mo-deskmawari-wo-miseroyo/ である。/blogというのは単にこのWebサーバ内のblogディレクトリの中にWordPressを突っ込んでいるからそうなっているだけで、WordPressから見ればURLは /omaera-mo-deskmawari-wo-miseroyo/ こうである。これはwp_posts.post_nameである。

`post_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',

unique付いてないんだな、phpで存在チェックしてるんだな、とかはどうでもよい。普通のMVCフレームワークで作ると……通常は上のparamをIndexControllerで受けつけようとすると /index/omaera-mo-deskmawari-wo-miseroyo となる。PHPでナウな感じじゃないなら /?post_name=omaera-mo-deskmawari-wo-miseroyo とかでもいいけど。

そういうわけで潜る前に

や、こんなんどこかでURLを解析して分岐してるだけなのはわかっている(そして美しくないコードであることも)のだが、このpost_nameをキーにして個別ページを描画するというルールに則った場合、お行儀の良いMVCにするのは不可能だなと。URLパターン変えてnginx側でredirectさせてもいいのだが(そもそもこんな泡沫blogのURLなんてどうでもいいのだが)めんどくさい!コードたくさん書くよりミドルウェアの設定を変えるほうがよっぽど!

追記 2020-12-21

debuggerで追いかけてみた。/wp-includes/class-wp.php内で鬼のような数の正規表現パターン(commentがーsearchがー等々)を所有してループで回し、リクエストにhitするかどうかーみたいのをやってる。想像通り(実装はあ"ーって感じだが)なのでもう追いかけるの終わりにする。