Ubuntu 16.04 / Apache / javascriptフォルダへのアクセスを修正する方法
UbuntuのApacheで/javascript/にアクセスした際に403 Forbiddenが表示される場合は、javascript-commonパッケージによって作成されたApacheのエイリアスがサイトのパスと競合していないか確認してください。ただし、403エラーは権限やディレクトリリスティング設定が原因で発生することもあるため、対策を行う前に実際のファイルレスポンスやサーバー設定を一緒に確認する必要があります。
まず確認すべきこと
この記事は、Ubuntu上でApache 2.4を使用する環境を前提としています。元の記事はUbuntu 16.04 LTSを対象としており、これは標準サポートと一般的なUbuntu Proサポートが終了している古いバージョンです。追加のレガシーサポートの条件を確認し、サポートされているバージョンへの移行を計画してください。サポートスケジュールはUbuntuセキュリティメンテナンススケジュールで確認できます。
ブラウザで/javascript/のアドレスを開いたときの403と、フォルダ内のJavaScriptファイルを読み込めない問題は別です。ディレクトリにデフォルトのインデックスファイルがなく一覧表示が無効な場合、フォルダのアドレスは403を返しても、個々のファイルは正常に配信されることがあります。
ブラウザの開発者ツールのネットワークタブで、実際に失敗したファイルのURLとステータスコードを確認してください。たとえば、サイトが参照している/javascript/app.jsが200、403、または404を返すかどうかを確認し、レスポンスの内容も調べてください。たとえ200を表示していても、意図したJavaScriptファイル以外のコンテンツが返される場合があります。
エイリアスの競合とは何ですか?
一部のUbuntuおよびDebian環境では、アクティブなjavascript-common構成に以下のようなエイリアスが含まれることがあります。この構成が適用されると、URLパス/javascriptはサイトのドキュメントルートの下にあるディレクトリとは異なるディレクトリを指すことがあります。
Alias /javascript /usr/share/javascript/
例えば、Apacheがリクエストされた/javascript/app.jsを/usr/share/javascript/の下で探す場合、元のサイトフォルダ内のファイルが提供されないことがあります。対象ファイルが存在しない場合は404が表示されることがあり、対象へのアクセスが拒否された場合やディレクトリ一覧が許可されていない場合は403が表示されることがあります。ステータスコードだけでエイリアスの競合を結論付けないでください。
このエイリアスは、URLの最初のパスセグメントが/javascriptであるリクエストに関連しています。他のセグメント(たとえば/assets/javascript/app.js)の下にあるすべてのjavascriptフォルダが自動的にそのエイリアスに一致するわけではありません。実際のマッピングと優先順位は、仮想ホスト、他のエイリアス、リダイレクト、リライトルールによって異なる場合があります。パスの一致や処理順序はApacheのエイリアスに関するドキュメントで確認できます。
アクティブな設定とエラーログを確認してください
Apacheのバージョンおよび仮想ホストを確認するためにサーバーに接続します。以下の検索は、設定ディレクトリ内の関連する文字列を見つけるもので、未使用の設定も結果に表示される場合があります。
apache2 -v
sudo apache2ctl -S
sudo grep -R -n -i javascript /etc/apache2
結果に/etc/apache2/conf-available/javascript-common.confが表示された場合、その内容を確認し、実際に有効化され/etc/apache2/conf-enabled/にリンクされているかどうかを検証してください。また、仮想ホスト固有の設定やその他のURLルールも確認してください。ファイルが存在しない場合やエイリアスが無効になっている場合、この設定が原因であると仮定しないでください。
ls -l /etc/apache2/conf-enabled/javascript-common.conf
sudo cat /etc/apache2/conf-available/javascript-common.conf
ファイルやシンボリックリンクが存在しないというメッセージが表示された場合、インストール状態やアクティブ状態が異なる可能性があります。リクエスト時のApacheエラーログを確認して、実際のパスと発生したエラーを確認してください。Ubuntuのデフォルト設定では/var/log/apache2/error.logが利用可能な場合がありますが、ログパスは各バーチャルホストごとに異なる場合があります。
sudo tail -n 50 /var/log/apache2/error.log
解決方法を選択してください
サイト上でファイルパスを変更できる場合は、エイリアスと重複しない/assets/js/のようなパスを使用し、HTML script のアドレスおよびビルド設定も変更してください。既存のアドレスを使用しているページ、キャッシュ、または外部リンクがある場合は、変更の影響を確認し、デプロイ後に実際のファイルを再度リクエストしてください。参照を変更せずにフォルダ名だけを変更すると、既存のページがファイルを見つけられなくなります。
既存の/javascriptアドレスを保持する必要がある場合、サーバー管理者はエイリアスを変更または無効化する前に、すべての仮想ホストとパッケージの依存関係を確認できます。javascript-common設定を無効にすると、他のサイトやパッケージで使用されるアドレスも変更される可能性があるため、まず影響を調査し、復旧手段を準備してください。パッケージの設定ファイルを直接編集すると、パッケージ更新時の管理がより複雑になる場合があります。
設定が有効であり、他のサービスによって使用されていないことを確認した場合のオプションは以下の通りです。このコマンドはサーバー全体のApache設定に影響を及ぼす可能性があります。実行後に構文チェックが失敗した場合は、リロードせず、原因を解決するか、まず設定を再有効化してください。
sudo a2disconf javascript-common
sudo apache2ctl configtest
構文チェックでSyntax OKが確認された場合にのみ設定をリロードします。サービス名は環境によって異なる場合があります。
sudo systemctl reload apache2
元に戻すには、次のコマンドで設定を再度有効にし、構文チェックが成功したときにのみリロードします。
sudo a2enconf javascript-common
sudo apache2ctl configtest && sudo systemctl reload apache2
変更後およびその他の原因を確認します
変更前に失敗した正確なファイルURLを再度リクエストし、ステータスコードとファイル内容を確認します。ブラウザのキャッシュをクリアするか、開発者ツールでキャッシュを使用しないように設定し、ページ上のネットワークリクエストとコンソールエラーをチェックします。また、既存の/javascriptパスを使用している他のサイトやパッケージも確認します。
もしエイリアスが原因でない場合や変更後も403エラーが続く場合は、ApacheのDirectory・Locationアクセスルール、ファイルの読み取り権限と親ディレクトリのアクセス権限、シンボリックリンクの設定、デフォルトのインデックスファイルおよびディレクトリリスティングのポリシーを確認してください。エラーを解消するために無作為にすべてのアクセスを許可したりディレクトリリスティングを有効にしたりしないでください。それにより、公開する意図のないファイルが露出する可能性があります。その代わりに、まず実際に必要なファイルとポリシーを確認してください。




