403 forbidden you don’t have permission to access とは
403 forbiddenはHTTPのエラーコードで「閲覧禁止」という意味です。
このエラーはサーバ管理者が対処します。webページ閲覧者は対処できません。
エラーの内容は「サーバ側で閲覧権限が与えられていないので見られない状態」です。ページ自体が存在していない404 Not foundとは異なります。
エラー発生の原因例1 公開ファイルのパーミッション設定ミス
下の図のように、index.htmlの権限によって、ページが見られたり(200 ok)、見られなくなります(403 forbidden)。
「index.htmlは所有者/グループがrootでapacheはread権限ありません」という表示が出ています。
webサーバの管理者はindex.htmlの権限を変更することで403エラーを解消することができます。
403 forbiddenが表示されているサイトを見る方法
残念ながらサイトの修復はウェブサイトの管理者しかできません。
しかし、一応サイトを見る方法はいくつかあるので紹介します。
キャッシュから閲覧
最近まで閲覧できていたページであればgoogleによって一時的にページが保存されていてそこから閲覧できる場合があります。
googleで検索するとタイトルの隣に▼のような三角マークがあるのでクリックすると「キャッシュ」というのがでてきます。
こちらをクリックするとgoogleでキャッシュされたデータからページを閲覧できます。ページによっては画像が見られなかったり、レイアウトが崩れている場合があります。
internet archiveを利用する
インターネットアーカイブはインターネット上にあるウェブサイトからデータ自動・手動で取得して保存しているサービスです。サイトURLを入力して検索するとアーカイブを検索できます。ある程度有名なサイトでないと残っていないかもしれませんが、取得されているサイトであれば複数の日付時点でのウェブサイトを閲覧することができます。
https://archive.org/search.php?query=
403エラーを解決する方法
下記の手順でエラーを原因を特定していきます
- ページが閲覧できないか確認する(エラーコードの確認)
- errorログを確認する
- ファイル・ディレクトリの権限を確認
- conf, .htaccessを確認する
ひとまずWEBページを確認しよう!
まずはページが実際に閲覧できないかをブラウザでウェブページを閲覧したり、curlコマンドで現状確認します。
※キャッシュ機能:勝手に以前読み込んだページを一時保存する機能
ブラウザから確認するとForbiddenの文字とともにエラー内容も記述されています。
ここでは「You don’t have permission to access /index.html on this server」サーバ上の/index.htmlにアクセスする権限がありませんと書いてあります。
エラーログの確認
次にエラーログを確認します。エラーログの保存先はhttpd.confやincludeした設定ファイル上に書いてあります。
apacheの場合、基本的には/var/log/httpdの下に作成されていると思います。
下記が実際に出力されているエラーログの例です。
index.htmlにファイルのパーミッションが原因でサーバアクセスが拒否されたと記録されています。記載されているindex.htmlのパーミッションを確認したところapacheが閲覧できる権限になっていことがわかります。
# cat error_log.20220104
[Tue Jan 04 11:38:28.238039 2022] [core:error] [pid 11981] (13)Permission denied: [client xx.xxx.xx.xx:61301] AH00132: file permissions deny server access: /var/www/example.com/htdocs/index.html
別のエラーではserver設定が原因でアクセス拒否されていると表示されています。この原因はdirectoryディレクティブでrequire all deniedとなっていたため表示できていませんでした。
[Tue Jan 04 11:38:28.238039 2022] [authz_core:error] [pid 13350] [client xx.xxx.xx.xx:61301] AH01630: client denied by server configuration: /var/www/example.com/htdocs/
webサーバにapacheを利用している場合の例ですが、こちらはconfにrequire all grantedと記述することで403エラーを解消できます。
<Directory /var/www/example.com/htdocs>
DirectoryIndex index.html index.php
AllowOverride All
Require all granted
</Directory>ソースコード
.htaccessやIncludeされたconfを確認
httpd.confやnginx.confを見ても特に怪しい設定は書いていないという場合もあります。
サーバの設定ファイルは一つのファイルに記述すると長くなってしまうので複数のconfに別々に記述することがあります。別のディレクトリに設定ファイルがないか確認しましょう。
IncludeOptional conf.d/*.conf
apacheの場合はhttpd -Sコマンドを使うと各バーチャルホスト毎の設定ファイルを確認できます。
Webサーバがapacheの場合は.htaccessというファイルがドキュメントルート配下に設置されていることがあります。.htaccessの設定はサーバのconfファイルの設定を上書きできるのでこのファイルがないか確認しましょう。
AH01630: client denied by server configuration:
apacheのエラーログに「AH01630: client denied by server configuration:」
と表示されている場合はまずはサーバconf側の設定を確認します。
・パターン1 Require all deniedが記述 → Require all grantedを書く
apache 2.4ではRequire all grantedを記述する必要がある。
<Directory /var/www/example.com/public_html>
DirectoryIndex index.html index.php
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
下記のようにDirectoryやLocationディレクティブなどにRequire all diniedがあると403エラーが発生する。
DirectoryIndex index.html index.php
Options FollowSymLinks
AllowOverride All
Require all denied ←この記述
・Reauire all grantedがない、またはコメントアウト
下記のようにRequire all grantedが書いていないような場合も403エラーが発生する
<Directory>
DirectoryIndex index.html index.php
Options FollowSymLinks
AllowOverride All
</Directory>
Require all denied をコメントアウトまたは削除しても403エラーになる。
・apache 2.2時代の古い書き方
DirectoryIndex index.html index.php
Options FollowSymLinks
Order allow,deny
Allow from all
order ~ Allow/Deny~ はapache2.4では無効
403エラーを解決する方法