エス技研

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.

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

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

  関連記事

CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法

CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。

CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども

CakePHP3でHtmlHelperを使ってリンクの設定をする方法のまとめ。基本形からURLを指定、class、id、targetを指定、mailtoのリンク、画像をアンカーに、JavaScriptのダイアログなどの解説。

CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法

CakePHP4のクリエビルダーを使って複数のOR条件をANDでつなぐSQL文を作成する方法を解説。OR条件を記述したwhere句を2つつなげて記述する。

CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4から外部のデータベースにアクセスする方法解説

CakePHP4のシステムから他のシステムのデータベースにアクセスをし、SQL文を実行する方法を解説。try-catchでエラーを取得する方法も解説。

CakePHP3のユーザ管理・認証プラグイン CakeDC/Usersの導入・機能解説・3.1.5対応
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応

CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。

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

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

CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法

CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。

CakePHP3ログファイルの出力方法・$this->log()の解説
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説

コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。

CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得

URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。