YOURLSとShlinkを比較|自前の短縮URLを実際に立てて分かった違いと選び方【2026年版】
2026-09-29
※内容は2026年9月25日時点の情報(YOURLS v1.10.6、Shlink v5.1.7)をもとにしています。
「SNSやLINEで配るリンクのクリック数を知りたい」「日本語のURLをテキストで送ると、長くなってリンクが切れてしまう」「Bitlyなどの外部サービスに頼らず、自分のドメインで短縮URLを持ちたい」。そんな方に向けて、自分のサーバーで動かせる短縮URLのオープンソース「YOURLS」と「Shlink」を比較します。
当サイトOSSMatchを運営する私たちは、自社サービスのリンク計測に使うため、2つを実際に同じVPSに立てて試しました。この記事では、公式の情報だけでは分からない、動かしてみて初めて分かった違いを中心にまとめています。
短縮URLを外部サービスに任せる不安
短縮URLは、SNSの投稿やチラシのQRコード、LINEの配信などで広く使われています。ただ、外部の短縮URLサービスに任せたままだと、次のような不安があります。
- サービスの料金や無料枠の条件が変わると、使い続けられなくなることがある
- 配ったリンクの転送先やクリックのデータが、自分の手元に残らない
- 他社のドメインのリンクは、受け取った人から「どこに飛ぶのか分からない」と警戒されやすい
自分のサーバーで短縮URLを持つという選択
一度配ったリンクは、印刷物やSNSの過去の投稿に残り続けます。そのため、短縮URLは「長く同じURLで動き続けること」が何より大事です。自分のドメインと自分のサーバーで持っておけば、外部サービスの都合で使えなくなる心配がなく、クリックのデータも自分で持てます。
自分で動かせる短縮URLのオープンソースの中でも、定番なのがYOURLSとShlinkです。ほかの選択肢はBitlyの代替ツール一覧で比較できます。
YOURLSとShlinkを実際に動かして比べた結果
2つを同じVPSに、Dockerで立てました。リバースプロキシ(Traefik)の後ろに置き、HTTPSで公開しています。
| 項目 | YOURLS | Shlink |
|---|---|---|
| GitHubスター数 | 約1.2万 | 約5,300 |
| 作り | PHP+MySQL/MariaDB(管理画面つき) | PHP製のAPIサーバー+別の管理画面(Web版クライアント) |
| メモリ(実測) | 約150MB(本体45MB+MariaDB 103MB) | 約250MB(SQLite使用時) |
| 転送のコード | 301(恒久的な転送) | 302(一時的な転送)。設定で変更可能 |
| クリックの記録 | クリック数・日時・参照元・IP | 訪問数に加え、ボットと人を区別して集計 |
| 統計の見方 | 短縮URLの末尾に「+」を付けると統計ページ | 管理画面で、短縮URLごとの訪問を表示 |
| QRコード | プラグインで対応 | 標準で対応 |
| 国別の分析 | 標準で対応(国判定のデータを同梱。訪問者IPが正しく取れていることが前提) | MaxMindの無料ライセンスキーを設定すると対応 |
| 日本語の画面 | なし(英語) | なし(英語) |
| ライセンス | MIT | MIT |
※GitHubのスター数は、OSSMatchの2026年9月時点のデータです。YOURLSとShlinkの個別ページで、最新の数値を確認できます。

動かして分かった違い
YOURLS:シンプルで分かりやすいが、プロキシの後ろでは設定が必要
YOURLSは、1画面で短縮URLの作成とクリック数の確認ができる、とても分かりやすいツールです。短縮URLの末尾に「+」を付けるだけで統計ページが見られるのも手軽です。一方で、実際に立ててみると、次の2点でつまずきました。
- 待ち受けポートが変わっていた:最新の公式Dockerイメージは、Webサーバーが80番ではなく8080番で待ち受けていました。以前の手順どおりにリバースプロキシの転送先を80番にすると、502エラーになります
- 訪問者のIPが記録されない:リバースプロキシの後ろに置くと、クリックのIPが、訪問者ではなくリバースプロキシのIPで記録されました。YOURLSは国判定のデータを同梱していて、統計ページで国別のクリックを表示できますが、このままでは正しく判定できません
IPの問題は、Apacheのremoteipモジュールを使う設定ファイルを1つ追加すると解決しました。IPの範囲は、リバースプロキシのDockerネットワークに合わせてください。
# Traefik などのリバースプロキシ経由のアクセスは、X-Forwarded-For の値を本当の訪問者IPとして使う
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 172.18.0.0/16
docker-compose.ymlのYOURLSのサービスに、このファイルを読み込ませます。
volumes:
- ./remoteip.conf:/etc/apache2/conf-enabled/remoteip.conf:ro
なお、YOURLSはインストール直後に、公式サイトなどへのサンプルの短縮URLが3件登録されています。使わない場合は削除しておきましょう。
Shlink:高機能だが、公開した直後からボットが大量に来る
Shlinkは、APIを中心にした設計で、機能が豊富です。QRコードの作成が標準で付いていて、タグで短縮URLを整理したり、複数のドメインを使い分けたりもできます。クリックの記録では、ボットと人を区別して集計してくれます。
驚いたのは、公開してわずか数十分で、存在しない短縮URLへのアクセス(Shlinkでいう「孤立した訪問」)が196件も記録されたことです。ボットが「/wp-login.php」や「/.env」など、よくある管理画面や設定ファイルのURLを片っ端から試しているものと考えられます。インターネットに公開したサーバーには、すぐにこうしたアクセスが来ることがよく分かります。
孤立した訪問の記録が不要なら、環境変数で止められます。
environment:
DEFAULT_DOMAIN: s.example.com
IS_HTTPS_ENABLED: "true"
INITIAL_API_KEY: ${SHLINK_API_KEY}
TIMEZONE: Asia/Tokyo
TRACK_ORPHAN_VISITS: "false"
また、Shlinkの管理画面(Web版クライアント)は、APIキーを画面の設定に含める作りです。自分で公開する場合は、管理画面の手前にBasic認証などをかけて、他人から見えないようにすることをおすすめします。データベースは、公式ではSQLiteがテスト向けとされているので、本格的に使うならPostgreSQLやMySQLを選びましょう。

日本語スラッグのURLも短く共有できる:WordPressとの連携
自分で短縮URLを持つと便利な場面の1つが、日本語のスラッグ(URLの末尾)を使っているWordPressサイトです。
Webサイト制作の仕事で、クライアントから「記事のURLをメールやLINEでテキストのまま送ると、リンクがおかしくなる」と相談を受けたことがあります。そのサイトは、記事のURLに日本語のスラッグを使っていました。日本語を含むURLは、コピーして貼り付けると、次のような長い文字列に変換されます。
https://example.com/%e4%bc%9a%e7%a4%be%e8%a8%ad%e7%ab%8b%e3%81%ae%e6%89%8b%e9%a0%86%e3%81%a8%e5%bf%85%e8%a6%81%e6%9b%b8%e9%a1%9e/
「会社設立の手順と必要書類」という12文字のスラッグが、130文字近いURLになってしまいます。これには、次のような問題があります。
- メールの途中で改行され、リンクが途中で切れることがある
- 受け取った人から見ると、意味の分からない文字列で、怪しいリンクに見える
- SNSの投稿やチャットで、文字数を大きく使ってしまう
短縮URLにすれば、どんなに長いURLでも「https://s.example.com/kQr6T」のような短い英数字になり、これらの問題がまとめて解消します。
工夫すれば、「共有する」ボタンで短縮URLを自動で作れる
YOURLSもShlinkもAPIを備えているので、WordPressと組み合わせれば、記事を公開したときに短縮URLを自動で作り、記事に「共有用の短いURLをコピー」ボタンを出すといったことも可能です。サイトの担当者や読者が、短縮URLのツールを開かなくても、ボタン1つで短いURLを使えるようになります。
次は、Shlinkを使った実装例です。記事を公開したときに短縮URLを作り、記事の情報(カスタムフィールド)に保存します。私たちの検証環境で、同じURLを2回送っても短縮URLが重複して作られないことを確認しています。
// 記事を公開したときに、Shlink で短縮URLを作って保存する
// SHLINK_API_KEY は wp-config.php に define しておく(コードに直接書かない)
add_action( 'publish_post', function ( $post_id ) {
if ( get_post_meta( $post_id, '_short_url', true ) ) {
return; // 作成済みなら何もしない
}
$res = wp_remote_post( 'https://s.example.com/rest/v3/short-urls', array(
'headers' => array(
'X-Api-Key' => SHLINK_API_KEY,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( array(
'longUrl' => get_permalink( $post_id ),
'findIfExists' => true, // 同じURLなら既存の短縮URLを返す
) ),
'timeout' => 10,
) );
if ( is_wp_error( $res ) || 200 !== wp_remote_retrieve_response_code( $res ) ) {
return; // 失敗しても記事の公開は止めない
}
$data = json_decode( wp_remote_retrieve_body( $res ), true );
if ( ! empty( $data['shortUrl'] ) ) {
update_post_meta( $post_id, '_short_url', esc_url_raw( $data['shortUrl'] ) );
}
} );
保存した短縮URLを、記事の下にコピー用のボタンとして表示します。
// 記事の下に「共有用の短いURLをコピー」ボタンを出す
add_filter( 'the_content', function ( $content ) {
$short = is_single() ? get_post_meta( get_the_ID(), '_short_url', true ) : '';
if ( ! $short ) {
return $content;
}
return $content . sprintf(
'<p><button type="button" data-url="%s" onclick="navigator.clipboard.writeText(this.dataset.url);this.textContent=\'コピーしました\'">共有用の短いURLをコピー</button> <code>%s</code></p>',
esc_attr( $short ),
esc_html( $short )
);
} );
実装するときは、次の3点に注意してください。
- APIキーは、ブラウザ側(JavaScript)に書かない:誰でも短縮URLを作れてしまいます。必ずサーバー側(PHP)で扱います
- 短縮URLのサーバーが遅い・止まっているときでも、記事の公開を止めない:私たちの検証でも、サーバーの負荷が高いときに応答が数秒遅れることがありました。失敗したら何もせず、あとで作り直せる作りにしておくと安心です
- 公開後にスラッグを変えた場合は、短縮URLの転送先も更新する必要があります
YOURLSでも、APIのshorturlという操作で同じように実装できます。
YOURLSとShlink、どちらを選ぶべきか
| こんな人に | おすすめ |
|---|---|
| とにかくシンプルに、短縮URLとクリック数だけ分かればいい | YOURLS |
| レンタルサーバー(PHP+MySQL)で動かしたい | YOURLS |
| QRコードも一緒に作りたい(チラシ・店頭POPなど) | Shlink |
| ボットを除いた、正確なクリック数を知りたい | Shlink |
| ほかのシステムからAPIで短縮URLを作りたい | Shlink(YOURLSにもAPIあり) |
| サーバーのメモリをできるだけ使いたくない | YOURLS |
| WordPressなどと連携して、短縮URLを自動で作りたい | どちらでも可能(APIあり) |
どちらを選ぶ場合も、短縮URL用の短いドメインを用意しておくと、リンクが短く覚えやすくなります。一度配ったリンクは長く残るので、ドメインは長く使い続けられるものを選びましょう。

まとめ:短縮URLは自分のドメインで持っておくと安心
YOURLSもShlinkも、メモリ150〜250MBほどで動き、VPSの小さなプランでも十分に運用できます。
- シンプルさとメモリの軽さを取るならYOURLS
- QRコード・ボットの区別・APIなど機能を取るならShlink
- YOURLSをプロキシの後ろに置くなら、訪問者IPの設定を忘れずに
- Shlinkの管理画面は、Basic認証などで保護する
すでにVPSを持っていれば、そこに同居させるのがおすすめです。これから用意する場合は、メモリ1GBのプランで、ほかの小さなツールと一緒に動かせます。
自分のサーバーでプッシュ通知を受け取る方法は、ntfyをVPSにセルフホストする手順で紹介しています。