OSSリンク短縮比較:Shlink vs YOURLS vs Kutt でURLを管理する
オープンソースラボ編集部 ・ 2026年6月13日
OSSリンク短縮比較:Shlink vs YOURLS vs Kutt でURLを管理する
Bitly($8/月〜)・TinyURL・Rebrandlyなどの有料SaaSに依存せず、自社ドメインでURLを短縮・追跡・管理できるセルフホストOSSリンク短縮ツールは、マーケティング・ドキュメント管理・QRコード生成に欠かせません。Shlink(PHP製・REST API充実・リアルタイム統計)・YOURLS(PHP製・最古のOSS URLリダイレクター・WordPress統合)・Kutt(Node.js製・モダンUI・パスワード保護)の3つが2026年のOSSリンク短縮ツールの主要選択肢です。
セルフホストリンク短縮ツールを使う理由
- 独自ドメイン:
s.example.com/abc123のように自社ブランドのURLを発行 - 完全な統計: クリック数・国・デバイス・ブラウザを自社サーバーで記録・分析
- リンク期限設定: 一定期間後に無効化するリンクをマーケティングキャンペーンに使用
- プライバシー: 訪問者データをBitly等のサードパーティに渡さない
主要ツールの概要
Shlink
2016年公開、PHP製のOSSです。GitHubスター3k+。REST APIとWebhook・リアルタイムクリック統計・QRコード生成が充実したOSS URLショートナーで、CLI/APIから短縮URLを管理できます。geo-IPによる国別クリック追跡・UTMパラメータ保持・カスタムスラッグに対応しています。
# docker-compose.yml: Shlink + Redis + MariaDB
version: "3.8"
services:
shlink:
image: shlinkio/shlink:stable
restart: unless-stopped
ports:
- "8080:8080"
environment:
DEFAULT_DOMAIN: s.example.com
IS_HTTPS_ENABLED: "true"
DB_DRIVER: mysql
DB_HOST: shlink-db
DB_NAME: shlink
DB_USER: shlink
DB_PASSWORD: ${DB_PASS}
REDIS_SERVERS: tcp://shlink-redis:6379
GEOLITE_LICENSE_KEY: ${GEOLITE_KEY} # GeoIPデータ用(無料登録)
SHORT_URL_UNIQUE_VISITS_STATS_ENABLED: "true"
depends_on: [shlink-db, shlink-redis]
shlink-db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS}
MYSQL_DATABASE: shlink
MYSQL_USER: shlink
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- shlink_db:/var/lib/mysql
shlink-redis:
image: redis:7-alpine
volumes:
shlink_db:
# Python: Shlink REST API で短縮URL・QRコードを自動生成
import requests
from typing import Optional
from datetime import datetime, timedelta
SHLINK_URL = 'https://s.example.com'
API_KEY = 'your-shlink-api-key'
HEADERS = {'X-Api-Key': API_KEY, 'Content-Type': 'application/json'}
def create_short_url(long_url: str, custom_slug: Optional[str] = None,
expires_days: Optional[int] = None,
max_visits: Optional[int] = None) -> dict:
'''Shlinkで短縮URLを作成(カスタムスラッグ・有効期限・最大クリック数対応)'''
payload = {
'longUrl': long_url,
'findIfExists': True, # 同じURLが既に存在する場合は既存のものを返す
}
if custom_slug:
payload['customSlug'] = custom_slug
if expires_days:
payload['validUntil'] = (datetime.now() + timedelta(days=expires_days)).isoformat()
if max_visits:
payload['maxVisits'] = max_visits
resp = requests.post(f'{SHLINK_URL}/rest/v3/short-urls', json=payload, headers=HEADERS)
data = resp.json()
return {
'short_url': data['shortUrl'],
'short_code': data['shortCode'],
'qr_url': f'{SHLINK_URL}/rest/v3/short-urls/{data["shortCode"]}/qr-code',
}
def get_visit_stats(short_code: str) -> dict:
'''短縮URLのクリック統計を取得(国別・デバイス別)'''
resp = requests.get(
f'{SHLINK_URL}/rest/v3/short-urls/{short_code}/visits',
headers=HEADERS,
params={'itemsPerPage': 100},
)
data = resp.json()
visits = data['visits']['data']
by_country = {}
for v in visits:
country = v.get('visitLocation', {}).get('countryName', 'Unknown')
by_country[country] = by_country.get(country, 0) + 1
return {'total': data['visits']['pagination']['totalItems'], 'by_country': by_country}
def bulk_create_campaign_urls(base_url: str, campaign: str, sources: list) -> list:
'''マーケティングキャンペーン用にUTMパラメータ付き短縮URLを一括作成'''
results = []
for source in sources:
utm_url = (f'{base_url}?utm_campaign={campaign}&utm_source={source}'
f'&utm_medium=email')
result = create_short_url(utm_url, custom_slug=f'{campaign}-{source}')
results.append({'source': source, **result})
return results
YOURLS
2009年公開、PHP製のOSSです。GitHubスター11k+。最古のOSSリンク短縮ツールで、最も成熟したコミュニティとWordPress・Zapierプラグインエコシステムを持ちます。シンプルなPHP+MySQLで動作し、管理ダッシュボードでURLを一元管理できます。
# docker-compose.yml: YOURLS
version: "3.8"
services:
yourls:
image: yourls:latest
restart: unless-stopped
ports:
- "80:80"
environment:
YOURLS_DB_HOST: yourls-db
YOURLS_DB_NAME: yourls
YOURLS_DB_USER: yourls
YOURLS_DB_PASS: ${DB_PASS}
YOURLS_SITE: https://s.example.com
YOURLS_USER: admin
YOURLS_PASS: ${ADMIN_PASS}
depends_on: [yourls-db]
yourls-db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS}
MYSQL_DATABASE: yourls
MYSQL_USER: yourls
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- yourls_db:/var/lib/mysql
volumes:
yourls_db:
Kutt
2017年公開、Node.js/TypeScript製のOSSです。GitHubスター8k+。パスワード保護・有効期限・カスタムドメイン対応のモダンUI搭載OSSリンク短縮ツールで、Redisキャッシング・PostgreSQL永続化・APIトークン認証によるREST API提供が特徴です。
# docker-compose.yml: Kutt
version: "3.8"
services:
kutt:
image: kutt/kutt:latest
restart: unless-stopped
ports:
- "3000:3000"
environment:
DB_HOST: kutt-db
DB_NAME: kutt
DB_USER: kutt
DB_PASSWORD: ${DB_PASS}
REDIS_HOST: kutt-redis
REDIS_PORT: 6379
JWT_SECRET: ${JWT_SECRET}
DOMAIN: https://s.example.com
DEFAULT_DOMAIN: s.example.com
LINK_LENGTH: 6
DISALLOW_ANONYMOUS_LINKS: "true" # 認証済みユーザーのみ短縮URL作成可能
USER_LIMIT_PER_DAY: 50
MAIL_HOST: smtp.example.com
MAIL_PORT: 587
MAIL_USER: ${SMTP_USER}
MAIL_FROM: noreply@example.com
MAIL_PASSWORD: ${SMTP_PASS}
depends_on: [kutt-db, kutt-redis]
kutt-db:
image: postgres:16-alpine
environment:
POSTGRES_DB: kutt
POSTGRES_USER: kutt
POSTGRES_PASSWORD: ${DB_PASS}
volumes:
- kutt_db:/var/lib/postgresql/data
kutt-redis:
image: redis:7-alpine
volumes:
kutt_db:
機能比較表
| 比較項目 | Shlink | YOURLS | Kutt |
|---|---|---|---|
| REST API | ✅ 充実 | △ | ✅ |
| QRコード生成 | ✅ | △(プラグイン) | ✅ |
| パスワード保護 | △ | △ | ✅ |
| 訪問統計 | ✅ geo-IP | △ | ✅ |
| GitHub Stars | 3k+ | 11k+ | 8k+ |
リンク短縮ツールはその他カテゴリ/categories/miscのプロジェクト管理ツールと統合してドキュメントリンク・Wiki URLを短縮してQRコード付きで配布します。マーケティングカテゴリ/categories/marketingのWebアナリティクス(Plausible/Umami)とShlink統計を組み合わせてキャンペーンリンクのクリック率とサイト流入を包括的に計測します。
FAQ
Q. ShlinkのQRコード生成APIでダウンロード可能なQRコード画像を取得するには?
A. ShlinkのREST APIエンドポイントGET /rest/v3/short-urls/{shortCode}/qr-codeでQRコード画像を直接取得できます。パラメータ: ?size=300(サイズ: px)・?format=png(フォーマット: png/svg)・?margin=10(余白px)・?color=000000(QRコード色HEX)・?bgColor=ffffff(背景色HEX)・?errorCorrection=L(エラー訂正レベル: L/M/Q/H)。実装: requests.get(f'{SHLINK_URL}/rest/v3/short-urls/{code}/qr-code?size=400&format=png&errorCorrection=H')でバイナリ画像を取得→open('qr.png', 'wb').write(resp.content)で保存。SVGフォーマット: format=svgでベクター画像取得→印刷物・看板用途に最適(解像度依存なし)。動的QRコード: 短縮URL自体のリダイレクト先を後から変更できる(ShlinkのPATCH /rest/v3/short-urls/{shortCode})→QRコードを印刷した後でもリンク先変更が可能。
Q. YOURLSのAPIでSlack BotからURLを短縮するには?
A. YOURLS署名APIでSlack Botのアクションハンドラーからリンクを短縮します。YOURLS API設定: user/plugins/ディレクトリにapiプラグインがデフォルト有効。APIキール生成: 管理ダッシュボード→User管理→APIキー生成。Slack Bot実装(Python Bolt): POST https://s.example.com/yourls-api.phpにaction=shorturl・url=長いURL・keyword=カスタムスラッグ・signature=APIキーを送信→JSON形式でshorturl返却→SlackメッセージにURLを埋め込んで返答。署名ベース認証: signatureパラメータにAPIキーを渡す方式(タイムスタンプ署名も対応: md5(タイムスタンプ+APIキー)をtimestampとsignatureで送信)→セキュアな自動化に対応。
Q. Kuttでチームメンバーにカスタムドメインを割り当てるには?
A. KuttのAdmin機能でカスタムドメインをユーザーに割り当てて、チームメンバーが独自ドメインのURLを発行できる設定が可能です。設定: ①管理者ダッシュボード→Domains→Add Domain②custom.example.comのDNS設定: KuttサーバーのIPにAレコード→Let's Encryptで自動SSL③ユーザーのCustom Domain設定でそのドメインを選択→そのユーザーが作成するURLはすべてcustom.example.com/xxxxx形式で発行。マルチテナント: 部署別・クライアント別にカスタムドメインを割り当て→ブランド別のURLを管理→統計もドメイン別に分離。API: POST /api/v2/linksにcustomDomain: custom.example.comを指定して特定ドメインのURLを発行。
Q. Shlink・YOURLS・Kuttのどれを選ぶべきですか?
A. REST API・QRコード・geo統計が必要ならShlink、最大のプラグインエコシステム・WordPress連携・PHP/MySQL環境ならYOURLS、パスワード保護・モダンUI・チーム利用・PostgreSQLならKuttが向いています。Shlink優位: ①OpenAPI仕様の充実したREST API→自動化・CI/CD統合が容易②geo-IPによる国別クリック追跡→マーケティング分析③マルチドメイン対応(1Shlinkインスタンスで複数短縮ドメイン管理)④Webhookで短縮URL作成・クリックイベントをn8n・Zapierに送信。YOURLS優位: ①2009年から続く最成熟のOSS・プラグイン200本以上②WordPress用の公式プラグインで記事内のURL短縮が1クリック③ダッシュボードでURLを一覧・検索・タグ付け。Kutt優位: ①URLにパスワード設定→限定公開ファイル配布・社内文書共有②有効期限付きURL→セキュアなダウンロードリンク③カスタムドメインのマルチテナント対応。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| REST API・QRコード・geo統計 | Shlink |
| WordPress統合・プラグインエコシステム | YOURLS |
| パスワード保護・モダンUI・チーム利用 | Kutt |