初心忘るべからず

新米システムライブラリアンの備忘録

国内の人と海外の人で閲覧させるページを振り分けるには

大学のウェブサイトでは日本語と英語のコンテンツをそれぞれ作成しているところが多いと思う。図書館も同様。

せっかくなので、留学生や海外の人には直接英語ページを参照してもらいたい。

いろんなサイトを見てきたが、実現方法は4つあるらしい。

 

.htaccess
日本国内のIP以外はリダイレクトで英語サイトに飛ばす設定をするというもの。
羅列が大変&国内の留学生、海外の日本人も強制的に飛ばされてしまうので、微妙。

 

javascript
navigator.browserLanguage
navigator.language
navigator.userLanguage
がenの場合に振り分けるという方法。
利用者側でjavascriptが無効だと作動しないので、なし。

 

php
環境変数「HTTP_ACCEPT_LANGUAGE」でブラウザの言語を見分ける方法。
「日本語」を押した場合にも英語版が表示されるループになったら・・・というのが怖いので避ける。

 

■HTMLのhead
さて困ったぞ、と思ってさらに検索すると、Googleで用意している記述がある模様。

support.google.com


それぞれ日英で対応するページのヘッダに以下を書けばいいそう。
<link rel="alternate" hreflang="言語" href="対応するURL" />

たとえば、index.htmlに対応するページがen/index.htmlであれば、
それぞれのヘッダに次のように書く。
・index.htmlのヘッダ
 <link rel="alternate" hreflang="en" href="http://○○○.library.ac.jp/index.html" />
・en/index.htmlのヘッダ
 <link rel="alternate" hreflang="ja" href="http://○○○.library.ac.jp/en/index.html" />

Googleでは、と書かれているがBingでも有効な模様。Yahooはダメだった。
英語圏のシェアはGoogleが多数を占めているから、まぁ良いか。


テスト環境について。
実際に海外に行ってアクセスするわけにはいかない。
IPをやめたのはそんな理由もある。
Googleの方法だと、[インターネットオプション]の全般タブの下の方にある「言語」をクリックし、言語に英語を追加して優先順位を最上位にすれば、英語ユーザの環境になる。

図書館ホームページのディスクリプション

ディスクリプションとはHTMLのhead内に記述する、そのウェブサイト(のページ)の説明文のことで、GoogleやYahoo等の検索エンジンで検索したときに表示される。

 

たとえば北大の図書館ではこのように表示されている。

f:id:trpic1010:20150910122114p:plain

ソースはこの通り。

<head>

<title>Hokkaido University Library</title>

(中略)

<meta name="description" content="北海道大学附属図書館。学内20近くの図書館・室利用案内、蔵書検索、貴重書画像、北海道大学の研究成果へアクセスできるほか、オンライン貸出更新・文献複写依頼等各種サービス、電子ジャーナル・データベースの入り口になっています。情報検索のコツも紹介。">

(中略)

</head>

  

 国立大学附属図書館86館中、ディスクリプションをいれているのは14館。その中でも紹介文を書いている館はたったの3館。「○○大学図書館の公式ホームページです」しか書いていなかったり、単にメニューを示しているだけの館が多い。

では私立大学はというと。数が多いので全館はみていないが、ディスクリプションを入れている館はやはり少数派であるようだ。

 

ディスクリプションを入れていないと、ページの最初の文が表示されてしまう。利用者が図書館のホームページにアクセスしようとした時、どういう行動をとるだろうか。

・大学のホームページからリンクをたどる?

・ブックマークしてくれている?

ヘビーユーザでもない限り、検索エンジンからたどってきているのではないだろうか。

 

せっかくウェブサイトを整備するなら、アクセスの一歩目にも目を向けたいところ。

SEOの観点ではなく、図書館や図書館のサイトで何ができるのかを、利用者へいかにわかりやすく伝えるかという点で、ディスクリプションまで設定できていると良い。

 

 

余談だが、ディスクリプションを入れていない館でお知らせがでている館の多いこと、多いこと。ウェブサイトの一番目立つところにお知らせがあるのだろう。数年前に、筑波のU先生が嘆いていたが、図書館界ではまだまだ「お知らせ族」は根強いようだ。

申請した利用者だけがサイトを閲覧できるようにするには(PHP認証)

図書館には知る人ぞ知るコンテンツがある。WEB目録(PDF)を、閲覧申請をした人にのみアクセスさせたいという要望があった。閲覧申請をした人にはID/PWを発行し、認証を経た上で閲覧させると。

 

利用の流れはこの通り。
ログイン画面→(認証)→PDFファイル一覧ページ→個々のPDFファイル

 

この認証を実現させる上で様々な図書やブログ記事を見てみたが(会員制サイトのアクセス制限が多いようだ)、どの方法もうまくいかなかった。
知識がない状態でサイト構築を任せられてしまった人のためにコードを以下にメモしておく。

 

それぞれの処理はこの通り。
1.ログイン処理はPHPのセッション変数を用いる
2.PDFのアクセス制限を.htaccessphpを用いて行う

 

1.はログイン認証をしてPDFファイル一覧ページを表示させる処理。
2.では個々のPDFファイルへ直アクセスされた場合の所作を指定している。

 

2.PDFのアクセス制限をphpにしたのは、Basic認証だと1ファイルを開く都度、ID/PWを入れねばならず煩雑なためである。
また、.htaccessを用いているので、PDFのみならずあるディレクトリに来たものは、認証を経るようにといった汎用的な使い方ができそうだ。

 

 

1.認証→PDFファイル一覧ページの表示

これについては大部分をこの図書に頼った。

ci.nii.ac.jp

PHP初心者にとってサンプルコードが付いているのはありがたい。

 

この処理で使うファイルは以下の通り。
・login.html:ログイン画面
・ninsho.php:認証チェックプログラム
・data/pw.txt:ID・PWを保存したファイル
・ichiran.php:PDFファイル一覧ページ
・includes/kiroku.php:インクルードファイル。ログインしているかどうかをチェックする処理。

それぞれのファイルにどのように書いたか記す。

「login.html」

<form action='ninsho.php' method='POST'>
ユーザーID
<input type="text" width="20" name="id" maxlength="10" /><br>
パスワード
<input type="password" width="20" name="pass" maxlength="10" /><br>
<input type="submit" value="送信"/>
</form>

このフォームは利用者がID/PWを入力する(だけの)画面。このフォームでID/PWを受け取り、1行目で指定した「ninsho.php」に受け取ったID/PWを投げている。

 

「pw.txt」

id pw
id2 pw2

IDとパスワードをタブと改行で区切っている。
このファイルは誰にも参照されないように、.htaccessで制限する。


「ninsho.php

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>WEB目録</title>
</head>
<body>
<?php
session_start();
$fname = 'data/pw.txt';
$result = @file($fname);
$flg = FALSE;
foreach($result as $val){
$id = strtok($val,"\t");
$pass = strtok("\t");
if (trim($id) == $_POST['id'] and trim($pass) == $_POST['pass']){
$_SESSION['ID'] = $id;
$flg = TRUE;
$url = "ichiran.php";
header("Location: $url");
}
}
if (!$flg){
unset($_SESSION['ID']);
echo "ID・パスワードが正しいかご確認ください。<br>もしくはCookieが有効になっているか確認ください。<br>";
}
?>

「login.html」で利用者が入力したID/PWを「pw.txt」と照合し、合っていればセッションを保存して、PDFファイル一覧ページへ飛ばす、間違っていればセッションを消してエラーメッセージを出すという処理を行っている。詳しくは図書を参照。


「kiroku.php

<?php
tu_checkLogin();

function tu_checkLogin(){
session_start();
if (isset($_SESSION['ID']) == FALSE){
header("Location:http://○○/○○.jp/△△/△△/includes/error.html");
}
}
?>

セッションの存在有無を確認するファイル。
「ninsho.php」でID/PWが間違っている場合、セッションを削除していた。FALSEであれば(認証情報(セッション)が空であれば)エラーに飛ばすという処理。


error.html」

認証されていません。<br>
必ず、認証を経てからアクセスしてください。<br>
<a href="login.php">戻る</a>

認証されていない場合はこちらのファイルが表示される。


「ichiran.php

<?php
include('./includes/kiroku.php');
?>
ページのコンテンツ(以下略)

HTMLコンテンツの前にこれを書くことで、まずkiroku.phpの処理が実行されるようにしている。直にこの「ichiran.php」ファイルにアクセスされた場合でも、この処理によりセッションの確認が行われる。OKであればそのまま表示し、NGであれば「error.html」に飛ばす。

 

 


2.個々のPDFファイルへ直アクセスされた場合の所作を指定

PDFの場合、「ichiran.php」のようにファイルの冒頭に処理を書くことができない。
そこで、PDFにアクセスされた場合、認証用のphpへリダイレクトし、それを通過した場合だけアクセスを可能にするように設定する。

 

この処理で使うファイルは以下の通り。
.htaccess:制限の記述
・includes/kiroku2.php:インクルードファイル。ログインしているかどうかをチェックする処理。
・PDF/○○.pdf:個々のPDFファイル達

 

まずはリダイレクトさせるために、PDFを置いているディレクトリ「pdf」に「.htaccess」を設置する。

.htaccess

Action application/pdf http://○○/○○.jp/△△/△△/includes/kiroku2.php

パスの書き方が分からなかった(varから書くのか?htmlフォルダのrootから書くのか?)のでURLで記入。PDFにアクセスされた場合は、「kiroku2.php」に飛ばしますよ、という処理。

別法として、こちらでもいけるかも。画像とかwordも制限したい時は、pdfの隣に「|」で拡張子をつなげばいい。(pdf|png

RewriteEngine on
RewriteRule ^.*\.(pdf)$ /△△/△△/includes/kiroku2.php

検索エンジンに収集されたくないので

<Files ~ "\.(pdf)$">

deny from all

</Files>

を書いてみたが、認証されている場合でも拒否してしまったので削除。


そしてここからが肝心の、セッションがなければ「error.html」に飛ばし、あれば指定のPDFにアクセスさせるという処理。ファイルパスの取得に四苦八苦したが、この方法でうまく渡すことができた。

「$_SERVER['SCRIPT_NAME']」(現在のスクリプトのパス)だとkiroku2.phpを見てしまうようなので、「$_SERVER["REQUEST_URI"]」(ページにアクセスするために指定されたURI)にしている。

 

「kiroku2.php

<?php
tu_checkLogin();

function tu_checkLogin(){
session_start();
if (isset($_SESSION['ID']) == FALSE){
readfile(dirname(__FILE__) . "/error.html");
}else{
$file_path = $_SERVER["DOCUMENT_ROOT"] . $_SERVER["REQUEST_URI"];
$file_size = filesize($file_path);
header("Content-Type: application/pdf");
header("Content-Length: $file_size");
readfile($file_path);
}
}
?>

ファイルパスの取得方法については

Apacheで、PDFファイルへのアクセスをフォーム認証へリダイレクトさせたい − Linux Square − @IT

を使わせてもらった。感謝。

 


以上でちゃんと動作するようになった。ここまで作るのに丸2日がかり。
四苦八苦な日々はまだまだ続く…。

アクセスログの検索方法

某所から不審なサイト○○や××へのアクセスがなかったか調査せよとの指令が出た。

以下の手順で調査。

1.プロキシサーバのアクセスログをサーバから自端末へダウンロード

2.サクラエディタGrep検索で検索

 サクラエディタを起動、ツールバーの「検索」から「Grep」をクリック。

 以下に設定し、検索

  ・条件:「URL1|URL2|URL3|……」

   ※「|」でつなぐことでor検索を行っている。

  ・ファイル名:「*.*」

  ・検索対象フォルダ:アクセスログを格納したフォルダを選択

  その他の条件として、「サブフォルダからも検索」「正規表現」にチェックを入れた。

  また、結果出力方式は「該当行」「ノーマル」に設定。

以上

 

なお、アクセスログ(1ファイルあたり1GB以上、800万行程度)を開くことのできたエディタはサクラエディタのみだった。TeraPad秀丸、Crescent Eveでは不可。

サクラエディタでも開くのに5分程度時間がかかった。

Grep検索ではファイルを開くことなく複数またがって検索ができるのでとても便利。

条件は100くらい「|」でつないだがきちんと動作できていた模様。

 

 

 

OPAC専用端末の設定

図書館では利用者がレポートを書いたり情報検索をしたりするための利用者用端末の他に、館内の蔵書を検索するための専用の端末(以下OPAC専用端末と称する)を設置している。

 

OPAC専用端末では蔵書検索以外をさせないために、様々な制限をかけている。

まずは、ネットワーク設定。

 ・DNSを空欄にする

 ・hostsの編集:OPACサーバのみを記入

 ・(プロキシの設定を空欄にする)

 この設定をすることで他のサイトへのアクセスを防いでいる。

 

hostsと言うのは端末におけるDNSのようなもの。DNSを空欄にするとOPACにもたどり着けなくなってしまうので、端末側でIPとアドレスの対応を教えてあげる必要がある。hostsファイルは以下のフォルダに置かれている。

C:\Windows\System32\drivers\etc 

 

hostsファイルの中身は、

 IPアドレス ホスト名

で構成される。OPACにだけアクセスさせる設定としては、

 OPACサーバのIPアドレスが123.45.67.89で、

 OPACサーバのホスト名がwww.toshokan.ac.jpだった場合は、

  123.45.67.89 www.toshokan.ac.jp

この1行を書くだけで良い。IPとホスト名の間はタブかスペースで区切る。

なお、hostsファイルは管理者権限で実行する。

 

※ただし、hostsはディレクトリ単位の設定はできないので、ウェブサイトとOPACが同じサーバで動いている場合、OPACだけを見せる、ということができない。

 

この他の設定としては、

・履歴を保存しない

・パスワードを保存しない

・使用させるアプリケーションの制限

などがある。

 

※ウイルスなどでhostsが書き換えられることがあるので、ウイルス対策ソフトや環境復元機能は必須。