エス技研

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 2.x 3.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数

CakePHP3で特定フォルダのパスの定数を解説。root、DocumentRoot、app、config、webroot、tests、tmp、cache、vendor、コア、コアの srcが設定済み。realpath()関数を使うと柔軟なパス指定が可能。

CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説

CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。

CakePHP 2.3でOn Duplicate Key構文を実装

CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。

CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3で保存前にバリデーション結果を取得する2つの方法

CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能

CakePHPの検索プラグイン Search Pluginの検索処理の中で order、ソートについての解説です。

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合

ID以外のカラムでアソシエーション(連携)させるための考え方とサンプルソースを用いての説明を行っています。

CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用

CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。

CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法
CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法

CakePHPで「CakeDC/Users」などルーティングを行うプラグインを利用するときに、favicon.icoやapple-touch-icon-144-precomposed.pngがNotFoundエラーになることがある。その対処方法の解説。