アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

リダイレクトするだけのプログラム

ダウンロード版同人作品の頒布をするとき用のプログラムをざっくり作ってあったので残しておく。

やってることは「特定のURLにアクセスされたら別のURLにリダイレクトする」だけです。
弊サークルでは、「サークル公式ドメインで用意した作品別URL」にアクセスされたら「ダウンロードコンテンツを設置したdropboxの公開ディレクトリ」にリダイレクトするようにしています。

そもそもそういう設置場所URLをダイレクトにバラまいて問題ないならこのプログラムを使う必要はないのですが、
使うと以下のようなメリットがあります。

  • 仮に設置場所を変えても配布URLを変える必要がない(設定を変更するだけでOK)
    • 単に設置場所の整理をしたい場合や、リダイレクト先のURLの方が外部に漏れちゃったので置き場所変えたい…という場合も配布した方のURLは気にしなくて済む
    • 逆に、設置場所は動かないけど自サーバのURLはいつ変わるか分からない…というときは向かないです
  • アクセスログを記録できる
    • 購入してもないのにランダムアタックしてくる奴がいたら分かるようになっています
    • 1つの設置場所に対して複数のURLを作ることもできるので、頒布するイベントや相手ごとにURLを変えれば簡単なマーケティングも可能かも
  • 特定IPからのアクセスを弾くことができる
  • 配布URLを好きな短いものにできる
    • 弊サークルでは「ttp://******.com/dlc/hoge」みたいな感じです。hogeの部分が作品ごとに変わる秘密のコードなやつ。
    • あからさまにdropboxとかのURLをバラまくのもカッコ悪いと感じる場合はそこも解決します

今回必要なかったので実装してませんが、ちょっと改造すれば「有効期限を過ぎたコードは無視する」みたいなこともできますね。

設置・設定方法は末尾に記載。

.htaccess

これは
「このファイルを置いたディレクトリ以下へのアクセスは全部↓の「index.php」にぶっこむよ!」
という設定のファイルです。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

ただ、.htaccessはレンサバによっては設置できなかったり無視されたりするケースもあります…厄介…
わたしが個人で使っているサーバ(さくら)は大丈夫なんですが、サークルのサーバ(エックス)はだめだったので結局別途対応しています。
サークル主に任せたので方法は把握してませんが、サーバによっては代替の手段があるようです。

index.php

<?php
// config ////////////////////////////////////////////////////////////////////////////

// このファイルを設置しているディレクトリパス(ドメインより後ろ)
$dirpath = "/download/";

// ログファイルパス
$ok_logpath = __DIR__ . "/access_ok.log";
$ng_logpath = __DIR__ . "/access_ng.log";

// IPブラックリスト
$ip_black_list = array(
	"xxx.xxx.xxx.xxx", // ダミー
);

// コードとリダイレクト先の対応
$codelist = array(
	'code_a' => "https://google.com/", // ダミー
	'code_b' => "https://yahoo.co.jp/", // ダミー
);

//////////////////////////////////////////////////////////////////////////////////////

// アクセス元IPを判別(ログ記録・ブラックリスト照合の用途)
// HTTP_X_FORWARDED_FOR と REMOTE_ADDR は前者を優先し、さらにカンマ区切りの場合は最後のものを採用
// 環境によっては上手く取れない可能性もなくはないです。様子見て要調整
$ip = (isset($_SERVER["HTTP_X_FORWARDED_FOR"]) && !empty($_SERVER["HTTP_X_FORWARDED_FOR"])) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
if (strpos($ip, ",") !== FALSE)
{
	$ip_list = explode(",", $ip);
	$ip = trim(array_pop($ip_list));
}

// 引数に渡されたコードを判別
preg_match("/^" . preg_quote($dirpath, "/") . "(.*)/", rtrim($_SERVER['REQUEST_URI'], "/"), $match);
$code = empty($match[1]) ? "" : $match[1];

// 【OKパターン】コードが定義されていれば対応するURLにリダイレクト
if (!empty($code) && isset($codelist[$code]) && !in_array($ip, $ip_black_list))
{
	// ログに記録
	if (!empty($ok_logpath))
	{
		file_put_contents($ok_logpath, "[" . $ip . "] " . $code . "\n", FILE_APPEND);
	}

	// リダイレクト
	header("Location: " . $codelist[$code]);
	exit();
}

// 【NGパターン】ログに記録
if (!empty($ng_logpath))
{
	file_put_contents($ng_logpath, "[" . $ip . "] " . $code . "\n", FILE_APPEND);
}

// --------------------------------------------------------------//
// PHP処理はここまで:NGパターンだった場合はそのまま下記HTMLを出力して終了 //
// --------------------------------------------------------------//
?>

<!DOCTYPE html>
<html>
<head>
  <title>ダウンロード</title>
  <meta charset="utf-8">
</head>
<body>
  <div style="text-align:center;">
    <Error!><br>URLが誤っています。<br>お手数ですがもう一度お確かめください。
  </div>
</body>
</html>

設置・設定手順

  • ダウンロードコンテンツdropboxの公開ディレクトリなどに設置する
    • もちろん自分のサーバ内に置くなどでもOK。とにかくアクセスすればダウンロードできるようなURLを作る
  • 上記の.htaccessとindex.phpを任意の公開ディレクトリに設置
  • 必要に応じてindex.phpを調整
    • $dirpath
      • 例えば設置場所が [domain]/download/ ならデフォルトのままでOK
    • $ok_logpath / $ng_logpath
      • アクセスログを取る場合のログファイルパス
      • okが成功時、ngが失敗時
      • ログを取らないなら空文字でOK
    • $ip_black_list
      • IPでブロックする場合のブラックリスト
      • 不審なアクセスがあった場合など、随時ここに追加するとそのIPからのアクセスを無視する
        • エラー等を出すのではなく、正しいコードだった場合も誤っている場合と同じ表示になります
    • $codelist
      • DL用のコードと実際のURLの対応表
      • 例えば「'hoge' => "ttps://google.com/"」という設定であれば、「[domain]/download/hoge」にアクセスすると「ttps://google.com/」にリダイレクトするというわけです
      • コードはパスワードみたいなものなので、「ランダムな長い文字列」にするほど不正なダウンロードを防ぐことができます。多少は構わないと考える場合やそもそも無料配布の場合などは簡単なものにしておいた方がアクセスしてもらいやすくなります
      • コードに使える文字はURL
    • NGパターンのHTML部分のデザインなど

一通り設定・設置してみて、例えば
「/download/」ならアクセスできるのに「/download/test」は404エラーになる!
というような場合は.htaccessが効いていない可能性が高いです。

で、サーバーによってどうしても.htaccess置けない場合はもう「[domain]/download/?c=hoge」みたいなクエリストリング式に改造するかーって感じですね。カッコ悪いけど。