PukiWiki 1.5.4の新機能「URLカスタマイズ」を使う

# はじめに
1.5.4からPukiWikiのURLをカスタマイズすることができるようになったみたいなので使ってみます。

今回は `/?ページ名` を `/ページ名` にしたいと思います。(~~なんかカッコイイですし~~)

## URLカスタマイズ
URLカスタマイズはPukiWikiで「動的URLを静的URLに見せかける」、「URLを短くする」などといったことをします。

補足：?, &, = が含まれたURLを動的URLといい、それに対して含まれないURLを静的URLといいます。

<br />

PukiWiki 1.5.4から追加された機能で詳細は以下、PukiWiki公式サイトの「URLカスタマイズの仕組み」に記載されてます。

https://pukiwiki.sourceforge.io/dev/?BugTrack/2525

PukiWikiは本来「てすとぺーじ」というページ名にアクセスするとURLは `https://.../?てすとぺーじ` となります。
?からはパラメータで、開いているページは暗黙的に `index.php` となっており、パラメータから受け取ったページを表示する仕組みとなっているのです。

静的URLにするメリットはSEO対策となるようですが、最近のクローラーは動的URLだとしても問題ないようです。

稀に1.5.4より前からURLを独自にカスタマイズしているものがあります。
例えば日本のWIKI サービスであるWIKIWIKIは、PukiWiki Plus!ベースですが、これも動的URLを静的URLに見せかけているようです。

以前では本体を改造する必要があったのですが、1.5.4からは本体の改造なしにできるようになったので手軽にできるようになりました。

## カスタマイズ例
https://pukiwiki.sourceforge.io/?PukiWiki/PageURI

公式サイトの上記ページに記載されていました。

|     カスタマイズ      |               URL               |  種類   |
| -------------------- | ------------------------------- | ------- |
|(1) デフォルト         | https://.../?てすとぺーじ        | 動的URL |
|(2) .html付き         | https://.../?てすとぺーじ.html   | 動的URL |
|(3) path風            | https://.../てすとぺーじ         | **静的URL** |
|(6) 短縮URLベース      | https://.../?&c1568344c7        | 動的URL |
|(7) 短縮URLリダイレクト | https://.../?てすとぺーじ (短縮URLにアクセスしてもページ名URLへリダイレクト) | 動的URL |
|(8) 短縮URL優先        | https://.../?c1568344c7 (ページ名URLにアクセスしても短縮URLへリダイレクト) | 動的URL |
|(9) 短縮URLベース2     | https://.../?c1568344c7         | 動的URL |

## URLを変更する手順
今回やりたいことは以下の「(3) ページ名を path に見せる」です。

https://pukiwiki.sourceforge.io/dev/?BugTrack/2525#u315499d

> ページ名の前に '?' がつかず、ページがそのままサーバー上のファイルのように見えるURL

つまり、`https://.../?ページ名` を `https://.../ページ名` にします。

### pukiwiki.ini.php の編集

(1) 92行目のIMAGE_DIRをルート相対パスで指定する
```php
// Static image files
-define('IMAGE_DIR', 'image/');
+define('IMAGE_DIR', '/image/');
```

PukiWikiが`https://example.com/`の直下に入っているならば`/image/`を
`https://example.com/pukiwiki/` とpukiwikiディレクトリであれば`/pukiwiki/image/`を指定します。

<br />

(2) Page-URI mapping handlerに関する設定は547行目にあります。
```php
class VirtualPathPageURIHandler extends PukiWikiStandardPageURIHandler {
    function get_page_uri_virtual_query($page) {
        return pagename_urlencode($page);
    }
}
pkwk_base_uri_type_stack_push(PKWK_URI_ROOT);
$page_uri_handler = new VirtualPathPageURIHandler();
```

を以下のように挿入します。

```pukiwiki.ini.php
/////////////////////////////////////////////////
// Page-URI mapping handler ( See https://pukiwiki.osdn.jp/?PukiWiki/PageURI )
-$page_uri_handler = null; // default
// $page_uri_handler = new PukiWikiStandardPageURIHandler();

+class VirtualPathPageURIHandler extends PukiWikiStandardPageURIHandler {
+    function get_page_uri_virtual_query($page) {
+        return pagename_urlencode($page);
+    }
+}
+pkwk_base_uri_type_stack_push(PKWK_URI_ROOT);
+$page_uri_handler = new VirtualPathPageURIHandler();
```

### .htaccess の編集
PukiWikiがルート直下であれば
```.htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^/$)
RewriteCond %{REQUEST_URI} !(^/image/)
RewriteCond %{REQUEST_URI} !(^/skin/)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(\.php$)

RewriteRule ^(.+)$ /?$1 [L]
```
を.htaccessに追記します。

例えば、`https://example.com/pukiwiki/` ならば
```.htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^/pukiwiki/$)
RewriteCond %{REQUEST_URI} !(^/pukiwiki/image/)
RewriteCond %{REQUEST_URI} !(^/pukiwiki/skin/)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(\.php$)

RewriteRule ^(.+)$ /pukiwiki/?$1 [L]
```

公式サイトの詳細では
```.htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
```
は記載されていませんが、念の為上記も追記して実際に存在するファイルやディレクトリは例外にしておきます。

### skin/pukiwiki.skin.php の編集
しかし、このままでは `/aaa/bbb` にアクセスした場合、CSSやJSが読み込まれないではありませんか...！

pukiwiki.skin.phpで `skin/`下のものが直接指定されている場合はすべて`/skin/`に変更します。
`<?php echo SKIN_DIR ?>`も `/<?php echo SKIN_DIR ?>`にします。

もし、 `https://example.com/pukiwiki/` にPukiWikiを設置しているのであれば、`/skin/` ではなく `/pukiwiki/skin/` にします。

PukiWiki標準スキンの場合は以下のように変更します。

(1) 75行目
```pukiwiki.skin.php
- <link rel="stylesheet" type="text/css" href="<?php echo SKIN_DIR ?>pukiwiki.css" />
+ <link rel="stylesheet" type="text/css" href="/<?php echo SKIN_DIR ?>pukiwiki.css" />
```

(2) 77-78行目
```pukiwiki.skin.php
- <script type="text/javascript" src="skin/main.js" defer></script>
- <script type="text/javascript" src="skin/search2.js" defer></script>
+ <script type="text/javascript" src="/skin/main.js" defer></script>
+ <script type="text/javascript" src="/skin/search2.js" defer></script>
```

別でスキンを突っ込んでる方は修正箇所が異なるので各自で対応してください。
- `SKIN_DIR` -> `'/' . SKIN_DIR`
- `skin/` -> `/skin/`
- `image/` -> `/image/`

pukiwiki.ini.php のIMAGE_DIRを変更しているのであれば、IMAGE_DIRに関しては変更を加えなくてもいいはずです。

# 終わりに
手軽にできるようになったとはいえ、スキンの編集やらはしなければなりませんねえ...
ぶっちゃけ変更してみて、コレに関しては好みにもよりますが、私は動的URLのほうが好きですね。