Daily Archives: 2020年4月5日

サイト内で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

URLから/cgi-bin/~.cgiを隠す

当ブログはblosxom.cgiを使わせて頂き構築しているのですが、そうするとホームページのURLが標準では~/cgi-bin/blosxom.cgiとなります。もちろんこれでも問題は無いわけですが、URLを紹介するときに長くなるしなんとなくスマートではない。っつーわけで、自室にこもる時間が長くなる時節柄、ちょっと時間を掛けて当ホームページから/cgi-bin/~.cgiを隠してみました。

.cgiを隠す

WEBサーバの/cgi-bin/.htaccessに下記構文を追記して、.cgiなしのリクエストを.cgiがあるものとして処理させます。(blosxomへのリクエストがblosxom.cgiへのリクエストとして処理され、結果URLから.cgiが見えなくなる)

/cgi-bin/.htaccess 

AddType application/x-httpd-cgi .cgi
MultiviewsMatch Handlers
Options +MultiViews

/cgi-bin/を隠す

単純に、/cgi-bin/を/jq3btu/にrenameしました。webソース内の色々な箇所に/cgi-bin/の記載があるため、全て書き換えて完成と思ったら、blosxomのページ切り替えのプラグインpaginateが拡張子なしに対応していないようで不具合を起こしてしまいました。カテゴリ分けした表示をしてる状態でページ切り替えをする時にpaginateリンク先URLが異常となって誤動作を起こすようで、paginateの改良。これはソースを解析するのちょっと時間が掛かりました。簡単な正規表現を追加しただけですが、正規表現が苦手な私はまたここでちょっと勉強・・・

paginate 

$prev_url = url(-path_info=>1,-query=>1);
$prev_url =~ s|$blosxom::url||;			# 追加 拡張子なしのアクセスでの不具合対応
$prev_link = fill_template('paginate_prev_link');
 :
$curr_url = url(-path_info=>1,-query=>1);
$curr_url =~ s|$blosxom::url||;			# 追加 拡張子なしのアクセスでの不具合対応
 :
$next_url = url(-path_info=>1,-query=>1);
$next_url =~ s|$blosxom::url||;			# 追加 拡張子なしのアクセスでの不具合対応
$next_link = fill_template('paginate_next_link');