エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


URL短縮サービス「TTTオンライン(https://ttt.onl)」公開

   

URL短縮サービス「TTTオンライン(https://ttt.onl)」公開

 
URL短縮サービス「TTTオンライン」をリリースしました。
https://ttt.onl
 
URL短縮サービス「TTTオンライン(https://ttt.onl)」公開
 

Googleの URL短縮サービス「Google URL Shortener」の代替を目指して

 
Googleの URL短縮サービス「Google URL Shortener(https://goo.gl/)」は 2019年03月30日に停止しますが、その期限が迫ってきました。(この記事を書いたのは、2019年03月下旬でした。)
 
そのため、新しい「URL短縮サービス」を探していたのですが、なかなかいい感じの URL短縮サービスを見つけることができませんでした。
Googleでさえサービスを終了させてしまう状況であるわけなので、利用し始めるサービスがいつまで続くか分からないと考えると、余計に何を条件に選べばいいのかが分からなくなってしまうのです。
 
また、日本語で提供されているサービスが見当たらなかったことも新しいサービスに乗り換えるのをためらった理由でもありました。
 
 
そんなこんなで、「どうしようか?」と悩んでいたわけですが、「だったら、自分で作ればいいじゃないか!」と思い至り、自分で作ることにしました。
自分で作ったサービスなら、自分の意志でサービスを継続することができますし、たとえ、サービスを終了させる状況が来たとしてもあきらめがつくだろう、と。
 
 

実は日本語の URL短縮サービスもあった

 
ちなみに、国産の URL短縮サービスとして、アナウンスされているサービスもありました。
 
それを知ったのは、サイトの構築を始めてから、何か参考になりそうなサイトを探しているときで、すでに作り始めていましたので、そこから開発を止めるという気持ちにはなりませんでした。
 
ただ、そのサービス、「国産」と書いてはありますが、提供元を示すものが一切ありませんので、本当に日本で作られているものなのかわかりません...
また、利用規約なども書いてありますが、だれと契約するものなのかが分かりませんので、規約として成立していないんですよねぇ...
 
 

URL短縮サービスとは?

 
URL短縮サービスとは、長い文字列の URLを短くしたい、というときに利用するサービスで、入力した長い文字列の URLを短い URLに変換して提供するサービスです。
メールや SNSなどに URLを書き込むときに少しでも短い URLにしたい、という場合などに利用するサービスです。
 
長い文字列の URLが入力されると、それに対するユニークな文字列を割り当てて短縮された URLを生成します。
そして、短縮された短い文字列の URLに対してブラウザからアクセスがあった場合は、サーバのリダイレクト機能を利用して元の長い文字列の URLにリダイレクトさせる、という仕組みのサービスです。
 
Googleを始め、多くの企業が提供していたサービスでしたが、Googleが提供していた URL短縮サービス「Google URL Shortener」は 2019年03月30日に新規で短縮 URLを生成することができなくなります。
「Google URL Shortener」は、新規の生成ができなくなりますが、これまでに生成された URLは当面は維持される模様です。
 
ですが、サービスの停止とあわせて、生成された URLの利用もできなくなるサービスもあり、多くのリンク切れを引き起こすという問題にもなっています。
そのため、恒久的なリンクが必要な場合には利用がためらわれるサービスであるようにも感じます。
 
 

URL短縮サービスの基本的な仕組み

 
URL短縮サービスの基本的な仕組みは、非常に単純です。
 
入力された URLに対して、ユニークな文字列を生成し、.htaccessのリダイレクト機能を使ってリダイレクト設定をする、というだけです。
 
 
下記は生成される .htaccessファイルの一部です。
 

 
上記の場合は、「https://ttt.onl/abcd」にアクセスがあった場合、「http://example.com/123.html」にリダイレクトをする、という設定です。
 
プログラムとしては、入力された URL「http://example.com/123.html」に対して、ユニークな文字列「abcd」を生成して、その情報を .htaccessファイルに出力する、というだけです。
 
今回のシステムは、CakePHP3で作成しましたが、CakePHP3のプログラムでは 50行程度の処理です。
 
 
ただ、サービスとして成立させるためには、登録した情報を削除できるようにしたり、QRコードを表示したり、管理画面から更新、削除したり、ユーザを管理したり、といった機能も必要としますので、もう少しだけプログラムを追加する必要があります。
(とはいえ、基本的なシステムの管理機能は、CakePHP3のフレームワークで構築できるわけなので、追加する機能があると言っても「もう少しだけ」という感じではあります。)
 
 

TTTオンラインはユーザ登録型のサービス

 
URL短縮サービスは、その仕組みから不正に利用される可能性があるため、当サービスではユーザ登録を必須としています。
 
ユーザ登録を行ったユーザに向けてのサービスということで、規約を定め、規約に反した利用をしたユーザに対しては、管理側から一括処理を行える仕組みを整えています。
 
不正利用に対して無防備なサービスを提供していると、サーバ会社やプロバイダーからサービス停止を迫られる可能性があることから、こういった不正利用に対しての仕組みを導入しています。
 
また、不正なサイトなどへのリダイレクトを登録した情報はログとして残りますので、不正な利用は行わないようにお願いします。
 
 

.htaccessのリダイレクトを設定する際の知らなかった設定

 
この URL短縮サービス「TTTオンライン」を作成していて初めて知った、かなりクリティカルな問題を発見しました。
というか、私が知らなかっただけの致命的な知識不足です。
 
今さらながら、.htaccessのリダイレクトを設定する際の知らなかった仕組みです。
 
 
例えば...
下記のようなリダイレクトの設定をしたとします。
 

 
「https://ttt.onl/i」を入力したら「http://example.com/123.html」にリダイレクトする、という設定です。
 
ですが、上記のリダイレクトの記述方法では、「https://ttt.onl/i」でも正しくリダイレクトしますが、「https://ttt.onl/img」でもリダイレクトをしてしまうのです。
そのため、「https://ttt.onl/img/test.jpg」のように、フォルダ名が「i」で始まる画像フォルダへのリンクがすべてリダイレクトされる、ということになるわけです。
 
実際に「TTTオンライン」の開発の検証中に、まさにその問題に遭遇してしまいました。
 
 
ただ、これについての解決方法は簡単です。
 

 
上記の通り、「^i」を「^i$」とすれば解決します。
 
これによって、「https://ttt.onl/i」だけが正しくリダイレクトするようになります。
 
 
これまでこのような知識がないまま、下記の様な .htaccessを使ってリダイレクトする解説記事を書いていたワケですが...
サイト更新、引越時に.htaccessでリダイレクトする方法解説
 
 
まぁ、一般的なサイトでリダイレクト設定をする場合、リダイレクトする URLはある程度の長さのある文字列ですので、あまり発生しない問題であるように感じます。
今回の件は、URL短縮サービスのような短い文字列でリダイレクト設定するために発生した問題、とも言えるでしょう。

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3で生の SQLの実行はConnectionManagerを使う

CakePHP3で生の SQL文を実行する方法を解説。クリエビルダーを使う場合は TableRegistryを利用するが、SQLを実行する場合は ConnectionManagerを使う。プリペアードステートメントの使用方法も解説。

CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説
CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説

CakePHP4でバッチ処理を行うためのコマンド・シェルの実装方法について解説。bakeでテンプレートファイルを作成し、「execute()」に処理を記述する方法を解説。

CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法

CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!

CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない

CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。

CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法

アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。

CakePHP3でComposerでインストールできないプラグイン、外部ライブラリを vendorに入れて手動で読み込む方法
CakePHP3でComposerでインストールできないプラグイン、外部ライブラリを vendorに入れて手動で読み込む方法

CakePHP3にComposerからインストールできないプラグインやライブラリなどを利用する方法、vendorにファイルを設置し、composer.jsonを更新し、それを呼び出す方法を詳細に解説。

CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法

CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。

CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合

CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。

CakePHP 2.3 Search Pluginで検索処理 その1設置方法

CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。

CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除

CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。