リダイレクトするだけのプログラム
ダウンロード版同人作品の頒布をするとき用のプログラムをざっくり作ってあったので残しておく。
やってることは「特定のURLにアクセスされたら別のURLにリダイレクトする」だけです。
弊サークルでは、「サークル公式ドメインで用意した作品別URL」にアクセスされたら「ダウンロードコンテンツを設置したdropboxの公開ディレクトリ」にリダイレクトするようにしています。
そもそもそういう設置場所URLをダイレクトにバラまいて問題ないならこのプログラムを使う必要はないのですが、
使うと以下のようなメリットがあります。
- 仮に設置場所を変えても配布URLを変える必要がない(設定を変更するだけでOK)
- 単に設置場所の整理をしたい場合や、リダイレクト先のURLの方が外部に漏れちゃったので置き場所変えたい…という場合も配布した方のURLは気にしなくて済む
- 逆に、設置場所は動かないけど自サーバのURLはいつ変わるか分からない…というときは向かないです
- アクセスログを記録できる
- 購入してもないのにランダムアタックしてくる奴がいたら分かるようになっています
- 1つの設置場所に対して複数のURLを作ることもできるので、頒布するイベントや相手ごとにURLを変えれば簡単なマーケティングも可能かも
- 特定IPからのアクセスを弾くことができる
- 配布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を調整
一通り設定・設置してみて、例えば
「/download/」ならアクセスできるのに「/download/test」は404エラーになる!
というような場合は.htaccessが効いていない可能性が高いです。
で、サーバーによってどうしても.htaccess置けない場合はもう「[domain]/download/?c=hoge」みたいなクエリストリング式に改造するかーって感じですね。カッコ悪いけど。