[No Index or No Permission!?]「403エラー」への対処法

コンピューターについてブログについて

初めに

 先日、自分が契約している独自ドメインの、トップレベルドメイン(ドメインの一番上の階層。俺の場合は「https://yuiitsu-muni-no-sonzaishoumei.com/」)にアクセスした際に、「403エラー(forbiddenエラー)」が検出された。当ブログは「/blog」というサブディレクトリにインストールされており、通常はトップレベルドメインにアクセスした場合、このサブディレクトリにリダイレクトされるはずである。ここではエラー解消に向けての対処法と、俺が実際に行った対処行動を記す。

「403エラー」とは

 403エラー(403 Forbidden Error)とは、そのサイトへのアクセス権限がないことを示すHTTPステータスコードで、以下のような原因により発生する。

①indexファイルの欠如

 指定されたディレクトリにindex.htmlやindex.phpなどのインデックスファイルが存在しない場合、403エラーが表示されることがある。

②アクセス権限の設定

 サーバー上のファイルやディレクトリに対するアクセス権限が正しく設定されていない場合に発生。特に、パーミッション設定(アクセス権を表す属性の設定)や.htaccessファイルの記述ミスが原因となることが多い。

③IPアドレスの制限

 サーバー側で特定のIPアドレスからのアクセスを制限している場合にも発生。

④WAF(Webアプリケーションファイアウォール)の設定

 セキュリティ対策としてWAFが誤作動し、正当なアクセスをブロックしている可能性がある。

各原因の究明と解決

 おおまかな手順としては以下となる。

  • ①ディレクトリにindexファイルが存在するか確認し、必要に応じて追加する。
  • ②サーバー(ルートディレクトリおよびそのファイル)のパーミッション設定を確認し、適切に設定されているか確認する。通常、ディレクトリのパーミッションは755、ファイルのパーミッションは644に設定される。
  • ③.htaccessファイルの記述に誤りがないか確認し(特に、サブディレクトリへのリダイレクト設定が正しいか確認)、必要に応じて修正する。
  • ④サーバーの管理者に問い合わせて、IPアドレスの制限やWAFの設定を確認してもらう。

①indexファイルの確認

 レンタルサーバーの管理画面で、FTP(File Transfer Protocol)機能を使ってルートディレクトリにアクセスし、index.htmlまたはindex.phpファイルが存在するか確認し、存在しない場合は新規作成を行う。

 専用のFTPクライアントを使用して、ルートディレクトリ(public_htmlなど)にアクセスする方法もある。使用するソフトは「FileZilla」がオススメ。無料で使えるオープンソースソフトで、使いやすくて安定動作する。先のリンクからダウンロードし、インストールする。

 ※インストーラをダウンロードした際に「望ましくない可能性のあるアプリが見つかりました」とWindwosセキュリティが反応する場合があるが、これはインストーラーにバンドルされている広告や追加ソフトウェアが原因である。これを避けたい場合は、ダウンロードページの下にある「Show additional download options」をクリックして、「FileZilla_3.68.1_win64.zip」などをダウンロードするといい。このファイルはインストール不要のポータブル版なので、広告などがバンドルされておらず、上記の警告も出ない。

 FileZillaを起動したら、上部の「ホスト」にアクセスしたいFTPサーバーの「ホスト名」を入力する(例:ftp.example.com)。横の「ユーザー名」と「パスワード」、「ポート番号(通常はデフォルトで21)」も入力し、「クイック接続」をクリックして接続する。接続が成功すると、中段のデュアルペインの左側にローカルファイル、右側にサーバーファイルが表示される。これでドラッグ&ドロップでファイルのアップロードやダウンロードが可能となる。

②パーミッションの確認

 ルートディレクトリおよびそのファイルのパーミッション設定が適切であることを確認する。FTPクライアントで任意の対象を右クリックして「パーミッション変更」を選択し、ディレクトリのパーミッションを755、ファイルのパーミッションは644に設定する。

③.htaccessファイルの確認

 ルートディレクトリに.htaccessファイルが存在するか確認し、存在しない場合は新規作成を行う。.htaccessファイルを編集し、以下のようなリダイレクト設定を追加する(例では/blogにリダイレクトしている)。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>
# END WordPress

 このコードはWordPressの標準的なリライトルールで記載されており、WordPressの内部リンク構造を管理し、存在しないファイルやディレクトリへのアクセスを全て、/blog/index.phpにリダイレクトしている。もしトップレベルドメインに対するアクセスにのみリダイレクトを設定したい場合、以下のような301リダイレクト(恒久的なリダイレクト)を行うこともできる。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^$ /subdirectory/ [L,R=301]

 ”example.com”を任意のドメイン名に、”subdirectory”をリダイレクト先のサブディレクトリに置き換えることで動作する。

④サーバーのサポートに問い合わせる

 以上の手順を試しても問題が解決しない場合は、レンタルサーバーのサポートに問い合わせてみる。サーバー管理画面の「サポート」セクションなどから移動し、問い合わせフォームを使用して問題を説明する。必要な情報(ドメイン名、エラーメッセージの詳細など)を提供し、サポートチームからの指示を待つ。

俺の置かれた状況では

 俺のブログはレンタルサーバーに独自ドメインを割り当てているので、初期ドメインと別のディレクトリに存在することが分かった。通常、初期ドメインはサーバーアカウントの直下に配置されており、例えば「\home\サーバーアカウント名\public_html」などに配置されているようだ。これが独自ドメインになると「\home\サーバーアカウント名\public_html\ドメイン名」のようになるらしい。

 しかし俺が契約している「ロリポップ!」サーバーでは、そのままルートディレクトリが初期ドメイン、そこにある「blog」フォルダが独自ドメイン、さらにそこにある「blog」フォルダが独自ドメインのサブディレクトリ(当ブログの所在地)となっている(恐らく各アカウントごとにパーティション分けされたストレージを割り当てているのだろう)。よってこの状況下で、独自ドメインのトップレベルドメインで「403エラー」が検出される理由は、「\blog」にindex.htmlなどが存在しないことだと思われる。

 ここでもし、トップレベルドメインにホームページを立てたいなら「index.html」、リダイレクトしたいなら「.htaccess」ファイルを配置するといいようだ。俺は今回ホームページを作りたいので、indexファイルを作っていく。任意の階層に新しいファイルを作成し、名前を「index.html」とし、パーミッション属性を「644(オーナーは読み取り権限と書き込み権限を持ち、グループメンバーとその他の人は読み取り権限を持つ)」に設定する。

 ファイルの内容はとりあえず以下のように入力する。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ホームページのタイトル</title>
<link rel="stylesheet" href="style.css"> <!-- CSSファイルのリンク -->
</head>
<body>
<header>
<h1>サイトのヘッダー</h1>
<nav>
<ul>
<li><a href="#">ホーム</a></li>
<li><a href="#">ブログ</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</nav>
</header>
<main>
<section>
<h2>メインコンテンツのタイトル</h2>
<p>ここにメインコンテンツを記述します。</p>
</section>
<section>
<h2>サブコンテンツのタイトル</h2>
<p>ここにサブコンテンツを記述します。</p>
</section>
</main>
<footer>
<p>© 2024 あなたのサイト名. All rights reserved.</p>
</footer>
<script src="script.js"></script> <!-- JavaScriptファイルのリンク -->
</body>
</html>

 ファイルを保存し、トップレベルドメインの403エラーが解消されていることを確認する。あとは先のコードを編集し、CSSなどを追記してデザインを整えれば完成。

 なお画像を使用する場合は、index.htmlと同じ階層に「images」などの名前でフォルダを作成し、そこに画像を保存すると分かりやすい。フォルダのパーミッション属性は「755(オーナーは読み取りと書き込み、実行の権限を持ち、グループメンバーとその他の人は読み取りと実行の権限を持つ)」に設定するといい(※画像ファイル自体は644でいい)。

 あとはhtmlファイルで以下のように記述すれば画像を参照することができる。

<img src="images/logo.png" alt="サイトのロゴ">

お終いに

 恥ずかしながら、今までトップレベルドメインのことはすっかり忘れており、FTPを使ってサーバーのディレクトリ構造を把握することもしていなかった。WordPressに来る前は、そんな機能のないBloggerというサービスを使っていたからだろう……。今回403エラーというきっかけがあったおかげで、当ブログがあくまでもサブディレクトリ上にあることを思い出すことができた――だから、ただいま急ピッチでホームページ作成を行っているところだ。

 とはいえホームページというのは、つまるところサブディレクトリへのリンクでしかないわけで、ただ飾り気のないリンクを置くだけなら、おとなしく.htaccessファイルでリダイレクトさせた方がスマートだ……。しかし幸い俺は、「このブログ以外にもサイトを創りたいな」と常々思っていたので、それらを含めたいくつかのリンクを持った、インタラクティブなホームページを創るつもりである。

 知識はないのにこだわりだけは強い俺のことなので、ホームページ完成まではまだまだ時間がかかるだろうが、もしよければ当ブログだけでなくそちらの方も、気が向いたときにのぞきに来てくれると嬉しい(※いろいろあって、ホームページの所在地はトップレベルドメインではなくなりました)。それでは今回の記事はここまでだ。最後まで読んでくれてありがとう。また次の記事で会おう。

追記:その他の403エラー

VPN使用時にWordPressのダッシュボードにアクセスできない

 こちらの環境でVPN使用時に、403エラーで自身のブログのWordPressダッシュボードにアクセスできない事態を確認した。VPNを切るか日本のVPNサーバーに切り替えたことで解決したので、WordPressは特定の地域からのアクセスを禁止するようにセキュリティ設定されていると思われる。

コメント

タイトルとURLをコピーしました