エス技研

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

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説

CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。

CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装

CakePHP3のCookbookにあるブックマークチュートリアル。ここで紹介されているタグで検索する処理を検索プラグイン「friendsofcake/search」で実現する方法を解説しました。

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

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

CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座

CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。

CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も

CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。

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

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

CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()

CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。

CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説

CakePHPのログ出力方法の解説。app.phpにログ設定をし、スコープやレベルを指定してログ出力を振り分ける方法、CakePHP4で配列出力にはvar_exportが必要なことなどを解説。

CakePHPを学ぶ際にはオブジェクト指向を学ぼう

CakePHPはオブジェクト指向で書かれていますので、CakePHPを学ぶにはオブジェクト指向も学びましょう。

CakePHP3で画像・ファイルのアップロード処理を自作・解説付き・その2
CakePHP3で画像・ファイルのアップロード処理を自作・解説付き・その2

ファイルのアップロード機能の自作サンプルコードとその解説のその2。アップロード機能に関連するファイルの更新や削除の処理や画像、フォルダのパスの指定方法などを含めて解説。