Category Archives: etc

サイト内でURLを転送する(.htaccessの記述方法)

一部混在していたURLの表記を統一したり、存在しないディレクトリへのアクセスからホームページに誘導するため、サイト内のURL転送を少し変更してみました。全て、.htaccessファイルへの記載です。

なお、何度も出てくる RewriteEngine on は、一度記載すれば以降は不要です。

httpからhttpsへ統一する

URL表記の先頭のhttpとhttpsはホームページのデータのやりとりのプロトコル(定義)をさしていて、httpは暗号化されていない、httpsは暗号化されていることを意味します。最近のブラウザは必ずと言ってもいいほどhttpsに対応していて、httpだと警告を発するブラウザも増えてきました。そこで当サイトも遅ればせながらhttpsに対応して、httpへのアクセスは全てhttpsへ転送するようにしました。

.htaccess 

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

wwwのあるなしをwwwありに統一する

普通にアクセスするにはどうでもいい事なんですが、enkai-ne.jpへのアクセスをwww.enkai-net.jpへ転送して統一するようにしました。

.htaccess 

RewriteEngine On
RewriteCond %{HTTP_HOST} ^enkai-net.jp$
RewriteRule ^(.*)$ https://www.enkai-net.jp/$1 [R=301,L]

ディレクトリを転送する

ディレクトリ名を/cgi-bin/から/jq3btu/に変更したため、古いディレクトリへアクセスがあった場合のエラー回避のためディレクトリごと転送しました。

.htaccess 

RewriteEngine On
RewriteRule ^cgi-bin(.*)$ /jq3btu/$1 [L,R=301]

index.htmlへのアクセスを転送する

ほとんどのWEBサイトのデフォルトホームページはindex.htmlなんですが、当ブログはindex.htmlへのアクセスはフレームでbloxsom.cgiへ転送していました。これを、URL転送に変更しました。

.htaccess 

RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://www.enkai-net.jp/jq3btu/blosxom [L,R=301]

存在しないファイル・ディレクトリへのアクセスを転送する

ほとんどのWEBサイトでは、

  • ディレクトリへのアクセスはそのディレクトリのindex.htmlへ転送
  • 存在しないファイルへのアクセスはエラー表示

となっており、当サイトもそのようにしていました。これを、ホームページへ転送するよう変更しました。※この設定によって、index.htmlファイルを消してしまったら上の設定は不要になります。

.htaccess 

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . https://www.enkai-net.jp/jq3btu/blosxom [L]

ディレクトリへのアクセス対策(おまけ)

ほとんどのレンタルサーバでは以上の設定でいいのですが、自前のサーバや一部のレンタルサーバでは、index.htmlやindex.cgi等を置いてないディレクトリ名へのアクセスはディレクトリ内のファイル構造を表示してしまい、直接そのディレクトリ内のファイルが読み取れてしまいます。実はWEBサーバの初期設定がそうなっているからです。逆に言えば対策されているレンタルサーバは親切に設定変更してくれているんです。この現象を回避するため、index.htmlやindex.cgi等を置いていないディレクトリ名へのアクセスを拒否します。

.htaccess 

Options -Indexes

WEBサイトのスパムメール対策

WEBサイトを運営して、一番ありがたいのが読者からの反応=メールによる連絡です。当サイトも全く個人的なグループ内専用だった頃は検索ロボットを拒否して素直にメールアドレス(フリーメール)を公開していたのですが、サイトをブログ形式に変更したと同時に積極的にロボットを受け入れるようにした結果、徐々にスパムメールが来るようになりました。

そこでまず取った対策が、メールアドレスを非公開にし、よくあるメールフォームでメールを受け取る方法。でも簡単だけど、専用ソフトによる自動投稿への対策は出来ないので、WEBで管理出来るようなフリーのCGIを利用するようになりました。もちろんちょっとだけ改造して。見かけはメール投稿フォームですが、実際はBBSへの投稿になっています。すなわち、私が外出中でも、BBSに返信書き込みをすれば、返信メールを送信するようになっています(この部分が私のオリジナル改造)。

しばらくは良かったんですが、来ました!専用ソフトによる自動投稿のスパム。内容的には全く意味のない単なる悪戯?嫌がらせ?なんですが、うっとうしいことには違いない。私への技術的挑戦と受け止め、技術的に対策する事にしました。罠を仕掛けてデータ収集した結果、自動投稿ソフトは直接CGIへデータを受け渡すことがわかったため、
-IPアドレスを監視し、フォームを開いたIPアドレスと投稿したIPアドレスが異なる場合はエラーとする
-投稿IPアドレスが空欄(匿名proxy利用)の投稿はエラーとする
-フォームを開いた時間と投稿した時間を監視し、その差がやけに長いか無限大などあり得ない場合はエラーとする(自動投稿ソフトは直接CGIへデータを渡すため無限大になる)
これらの対策を施しました。よくあるIPアドレスを指定して拒否することは、簡単ですがはっきり言って全く無効です。IPアドレスの偽装は簡単ですから、相手は匿名proxyなどを使ってランダムなIPアドレスで攻めてきます。匿名proxyを使った手動投稿の多くは上の2つで回避出来ましたが、その後専用ソフトを使ったと思われる連続投稿に攻められ、3つ目の対策を行いました。これは効果てきめんで、先日までは完全にシャットアウト出来ておりました。

ところが、これを上回る投稿が出現。繰り返して書きますがCGIで書いた投稿フォームで、上記の対策をすり抜けて投稿してくる強者です。すなわち、投稿するための画面を開き、さらに数秒後にフォームにコメントを書いて投稿してくるんです(もしかしたら、本当に手作業で投稿しているのかもしれませんが)。これこそ、私への技術的挑戦!さらに、簡易的ですが対策を追加する事にしました。
-メールアドレスをチェックし、@.***形式以外はエラーとする(実は恥ずかしながら、あり得ないメールアドレスも受け付けていました)
-投稿本文が英語のみの投稿をエラーとする
これで、海外からの投稿はほぼシャットアウトされると思います。

蛇足ですが、スパム投稿対策の王道である禁止ワードチェックは、使わせて頂いているフリーのCGIが元々対応しておりました。不思議ですが、今のところ、そこに引っかかる投稿はないんですよね。コメントが数文字の、明らかに無意味な投稿が来るんです。これが、私への挑戦状と受け止めている大きな理由なんですが・・・。ホントは、数文字の投稿を無視するのが一番簡単だし、文字も決まってるからその文字を禁止ワードで拒否するのがもっと簡単なんですが。

スパム投稿対策のアルゴリズムを公開するのは手の内を明かすようでやめていたのですが、スパム投稿はほとんどが英語だから日本語で書いても読めないだろうし、黙って対策するより、同じことで困っている人がたくさんいるので、公開することにしました。罠を仕掛けてログを取れば思いつく簡単なアルゴリズムですから、隠すほどのことでもないですしね。困っているみなさん、あなたのBBSのCGIにも実装して下さい。

※ロボット検索用に書いておきます。当初の対策で拒絶出来たワードは”abc123″、それで回避出来ない強者のワードは”Hello world”。試しに前者でググってみて下さい。連続投稿され、手に負えず放置状態になっているBBSが大量に見つかる事でしょう。逆に言えば、スパム対策を行っていないBBSを淘汰するためにやってるのかな?そんなことを考えつつ上記ワードで検索してますが、まだそれらの解説ページは見つかっていません。誰も書いてない事が、私がこの記事を書く事にした理由の1つなんですが。誰か情報下さい!

ブラウザキャッシュの制御

WEBサイトを閲覧する際に、ブラウザの機能でデータをパソコンに保存しています。で、次に同じページを閲覧する時には表示を早くするためにそのデータを利用してインターネットからダウンロードしない仕組みになっています(ブラウザキャッシュ)。ところが、そのデータが悪さをして、掲示板など頻繁に更新されるページは、「実際には新規書き込みがあるのに表示されない」なんて不具合が生じることがあるのです。本来ならば、ブラウザがちゃんとファイルを比較して表示すべきなのですが、うまく動作しないことも多いようです。そうなると、「更新」アイコンをクリックしても更新されません。

そう言った不具合を、WEBページ側で解消するテクニックを紹介します。

htmlのヘッダ~内に次のように記述すると、そのページはキャッシュされません。

<head>
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Cache-Control" content="no-cache">
  <meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">
</head>

上の2行がブラウザに対しキャッシュさせないための命令、下の1行がブラウザに対しキャッシュを捨てる日付を指定する命令(過去の日付を指定することですぐに捨てさせる)です。

ブラウザのバグや機能差で必ず機能するとは限りませんが、有効な手段ではあります。