外部サイトへのリンクはクッションページを経由させたい

2020年5月28日 at 0:03

外部サイトに対するリンクについて以下のような挙動にしたいです。
外部へのリンクをクリック → 確認ページ(クッションページ) →目的のページ
PukiWikiでいう 外部リンクをリダイレクトページ経由にすることで、Refererを消す 機能です。

実装したい理由としてはreferrerヘッダに社外秘なプロジェクト名などが含まれることを回避するためです。

この機能をC5で実現する方法はありますでしょうか。
どうぞ、よろしくお願いいたします。

-----ここからC5の環境情報-----
# concrete5 Version
Core Version - 8.5.2
Version Installed - 8.5.2
Database Version - 20190925072210

# Database Information
Version: 10.3.22-MariaDB
SQL Mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

# concrete5 Packages
Stucco (2.1.6)

# concrete5 Overrides
blocks/autonav/templates/view.css, blocks/autonav/templates/c_breadcrumbs.php, blocks/autonav/templates, blocks/autonav

# concrete5 Cache Settings
Block Cache - On
Overrides Cache - On
Full Page Caching - Off
Full Page Cache Lifetime - Every 6 hours (default setting).

# Server Software
LiteSpeed

# Server API
litespeed

# PHP Version
7.2.29

# PHP Extensions
apcu, bcmath, bz2, calendar, Core, ctype, curl, date, dom, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, igbinary, imagick, intl, json, libxml, litespeed, mbstring, mcrypt, mysqli, mysqlnd, openssl, pcntl, pcre, PDO, pdo_mysql, pdo_sqlite, Phar, posix, readline, redis, Reflection, session, shmop, SimpleXML, sockets, SPL, sqlite3, standard, sysvmsg, sysvsem, sysvshm, tokenizer, wddx, xml, xmlreader, xmlwriter, xsl, Zend OPcache, zip, zlib

# PHP Settings
max_execution_time - 7200
log_errors_max_len - 1024
max_file_uploads - 20
max_input_nesting_level - 64
max_input_time - 60
max_input_vars - 1000
memory_limit - 1024M
post_max_size - 512M
upload_max_filesize - 500M
mysqli.max_links - Unlimited
mysqli.max_persistent - Unlimited
pcre.backtrack_limit - 1000000
pcre.recursion_limit - 100000
redis.pconnect.connection_limit - 0
session.cache_limiter - no value
session.gc_maxlifetime - 7200
opcache.max_accelerated_files - 10000
opcache.max_file_size - 0
opcache.max_wasted_percentage - 5

タグ:

Re: 外部サイトへのリンクはクッションページを経由させたい

2020年5月28日 at 11:47
作れば簡単にできそうですが、現状マーケットプレイスに該当のものはないですねぇ…。
誰か作ってる人いませんか?
 

Re: 外部サイトへのリンクはクッションページを経由させたい

2020年6月2日 at 19:25
これ、concrete5のブロックで対応!とかではなく、
javascript埋め込みでの対応でもアリですか?
 

Re: 外部サイトへのリンクはクッションページを経由させたい

2020年6月2日 at 23:52
aniyaさん。

返信ありがとうございます。
今のところあらゆる方法を模索している段階ですので、どういったアイデアでも歓迎です。
ぜひ、お教えいただきたく思います。
 

Re: 外部サイトへのリンクはクッションページを経由させたい

2020年6月3日 at 14:12
ほんじゃぁ、ボケ防止のお勉強がてら作成したブツをお試しください。

<script>
function openCushion(e) {
host = location.hostname;
href = this.getAttribute("href");
dn = href.indexOf(host);
if (~href.indexOf("://") && (dn <= -1 || dn > 8)) {
nw = window.open("", "cushion");
ws =
'<p style="text-align:center;margin-top:20px;">' +
'<a href="%s" rel="noreferrer">%s</a><br>にジャンプしちゃうんですか?<br>' +
'<button onclick="window.close();" style="margin-top:20px;">CANCEL</button></p>';
nw.document.body.innerHTML = ws.replace(/%s/g, href);
e.preventDefault();
}
}
window.addEventListener("load", function () {
if (!this.document.getElementById("ccm-tooltip-holder")) {
document.querySelectorAll("a").forEach(function (ce) {
ce.addEventListener("click", openCushion);
}, false);
}
});
</script>


設置方法:
外部へのリンクがあるページに上記をコピペしたHTMLブロックを追加すればOK。
リンクとして埋め込む時は最初と最後の<script></script>タグを外して.jsファイル(例 noreferrer.js)として保存し、適宜ヘッダやbody終盤あたりから読み込んでください。
テンプレートで読み込む場合のサンプルコードは次の通り。

<script type="text/javascript" src="<?= $view->getThemePath() ?>/js/noreferrer.js"></script>


使い方:
編集モードでは動作しませんので、設置後ログアウトした状態でお試しください。
外部リンクをクリックすればクッションページが開きジャンプの確認をします。

動作条件:
次の場合は通常のリンクとして動作します。
・編集モード時
・「絶対パス」「相対パス」「mailto」のリンク
・同一FQDN向けのリンク
 ※サブドメインが異なる場合はクッションページが表示されます。

お試しあれ。
 

Re: 外部サイトへのリンクはクッションページを経由させたい

2020年6月3日 at 17:04
ありがとうございます。早速試してみます。

===ここから追記===
試してみました。意図したとおりの動作です。
ありがとうございました。

追加での質問になってしまい申し訳ないのですが、このコード書き換えることでユーザーがログインした状態でも動作させることは可能なのでしょうか?
 理由:構築予定のC5は基本的にログインした状態を前提として閲覧権限などを設定するため

大変お手数をおかけしますが、どうぞよろしくお願いいたします。
 

Re: 外部サイトへのリンクはクッションページを経由させたい

2020年8月1日 at 12:09
追記に気づかず申し訳ないです。
> このコード書き換えることでユーザーがログインした状態でも動作させることは可能なのでしょうか?
はい、可能です。
ccm-tooltip-holder の有無でログイン状態を判断しているので、
そこら辺をいじってみてください。
 

Re: 外部サイトへのリンクはクッションページを経由させたい

2020年11月11日 at 16:33
遅くなりましたが、返信ありがとうございました。

ログイン状態でも意図した動作となりました。
ありがとうございました。