Ubuntu 16.04 / Apache / Comment résoudre l'accès au dossier javascript

Si un 403 Forbidden apparaît lors de l'accès à /javascript/ sur Apache dans Ubuntu, vérifiez si l'alias Apache créé par le paquet javascript-common entre en conflit avec le chemin du site. Cependant, des erreurs 403 peuvent également survenir en raison des permissions ou des paramètres de listing des répertoires, donc vous devriez vérifier la réponse réelle du fichier et les paramètres du serveur ensemble avant d'agir.

Choses à vérifier en premier

Cet article est basé sur un environnement utilisant Apache 2.4 sur Ubuntu. L'article original couvrait Ubuntu 16.04 LTS, qui est une ancienne version dont le support standard et le support général Ubuntu Pro sont terminés. Vérifiez les conditions pour un support supplémentaire pour les versions anciennes et prévoyez de migrer vers une version prise en charge. Le calendrier de support peut être consulté à Calendrier de maintenance de la sécurité Ubuntu.

Le problème de voir un 403 lors de l'ouverture uniquement de l'adresse du dossier /javascript/ dans un navigateur et de ne pas pouvoir charger les fichiers JavaScript à l'intérieur sont des problèmes différents. S'il n'y a pas de fichier index par défaut dans le répertoire et si la liste des répertoires est désactivée, l'adresse du dossier peut retourner 403, mais les fichiers individuels peuvent toujours être servis normalement.

Vérifiez l'URL et le code d'état du fichier qui a réellement échoué dans l'onglet Réseau des outils de développement du navigateur. Par exemple, vérifiez si /javascript/app.js référencé par le site renvoie 200, 403 ou 404, et inspectez également le contenu de la réponse. Même s'il affiche 200, un contenu autre que le fichier JavaScript prévu peut être renvoyé.

Qu'est-ce qu'un conflit d'alias ?

Dans certains environnements Ubuntu et Debian, la configuration active de javascript-common peut inclure des alias comme les suivants. Lorsque cette configuration est appliquée, le chemin d'URL /javascript peut pointer vers un répertoire autre que celui sous la racine des documents du site.

Alias /javascript /usr/share/javascript/

Par exemple, si Apache recherche le /javascript/app.js demandé sous /usr/share/javascript/, les fichiers du dossier du site original peuvent ne pas être servis. Si le fichier cible n'existe pas, un 404 peut apparaître, et si l'accès à la cible est refusé ou si la liste des répertoires n'est pas autorisée, un 403 peut apparaître. Ne concluez pas à un conflit d'alias uniquement sur la base du code d'état.

Cet alias est lié aux requêtes où le premier segment du chemin de l'URL est /javascript. Tous les dossiers javascript sous d'autres segments, comme /assets/javascript/app.js, ne correspondent pas automatiquement à cet alias. La correspondance réelle et la priorité peuvent varier en fonction des hôtes virtuels, d'autres alias, des redirections et des règles de réécriture. Vous pouvez vérifier la correspondance des chemins et l'ordre de traitement dans la documentation Alias d'Apache.

Vérifiez les paramètres actifs et les journaux d'erreurs

Connectez-vous au serveur pour vérifier la version d'Apache et les hôtes virtuels. Les recherches suivantes permettent de trouver des chaînes pertinentes dans les répertoires de configuration, et des paramètres non utilisés peuvent également apparaître dans les résultats.

apache2 -v
sudo apache2ctl -S
sudo grep -R -n -i javascript /etc/apache2

Si /etc/apache2/conf-available/javascript-common.conf apparaît dans les résultats, vérifiez son contenu et assurez-vous qu'il est réellement activé et lié à /etc/apache2/conf-enabled/. Passez également en revue les paramètres spécifiques aux hôtes virtuels et les autres règles d'URL. Si le fichier est manquant ou si l'alias est désactivé, ne supposez pas que ce paramètre soit la cause.

ls -l /etc/apache2/conf-enabled/javascript-common.conf
sudo cat /etc/apache2/conf-available/javascript-common.conf

Si vous recevez un message indiquant que le fichier ou le lien symbolique n'existe pas, alors l'installation ou l'état actif est différent. Vérifiez les journaux d'erreurs d'Apache au moment de la requête pour voir le chemin réel et les erreurs rencontrées. Dans la configuration par défaut d'Ubuntu, /var/log/apache2/error.log peut être disponible, mais les chemins des journaux peuvent différer pour chaque hôte virtuel.

sudo tail -n 50 /var/log/apache2/error.log

Choisissez une méthode de résolution

Si il est possible de changer le chemin du fichier sur le site, utilisez un chemin comme /assets/js/ qui ne chevauche pas l’alias, et modifiez également l’adresse HTML script ainsi que les paramètres de construction. S’il y a des pages, des caches ou des liens externes utilisant l’adresse existante, vérifiez l’impact du changement et demandez à nouveau les fichiers réels après le déploiement. Renommer simplement le dossier tout en conservant les références inchangées entraînera l’impossibilité pour les pages existantes de trouver le fichier.

Si vous devez conserver l'adresse /javascript existante, l'administrateur du serveur peut examiner les dépendances de tous les hôtes virtuels et paquets avant de modifier ou désactiver l'alias. Désactiver le paramètre javascript-common peut également modifier les adresses utilisées par d'autres sites ou paquets, il faut donc d'abord évaluer l'impact et préparer des mesures de récupération. Modifier directement le fichier de configuration du paquet peut compliquer la gestion lors des mises à jour du paquet.

Les options suivantes sont disponibles une fois que vous avez confirmé que le paramètre est activé et n'est pas utilisé par d'autres services. Cette commande peut affecter l'ensemble de la configuration Apache du serveur. Si la vérification de la syntaxe échoue après l'exécution, ne rechargez pas ; résolvez d'abord la cause ou réactivez la configuration.

sudo a2disconf javascript-common
sudo apache2ctl configtest

Rechargez la configuration uniquement si la vérification de syntaxe confirme Syntax OK. Le nom du service peut varier en fonction de l'environnement.

sudo systemctl reload apache2

Pour revenir en arrière, réactivez le paramètre avec les commandes suivantes et rechargez uniquement lorsque la vérification de syntaxe réussit.

sudo a2enconf javascript-common
sudo apache2ctl configtest && sudo systemctl reload apache2

Vérifiez après les modifications et autres causes

Demandez à nouveau l'URL exacte du fichier qui a échoué avant la modification, et vérifiez le code d'état et le contenu du fichier. Videz le cache de votre navigateur ou configurez vos outils de développement pour ne pas utiliser le cache, puis vérifiez les requêtes réseau et les erreurs de console sur la page. Inspectez également d'autres sites ou packages qui utilisaient le chemin existant /javascript.

Si l'alias n'est pas la cause ou si le code 403 persiste après le changement, vérifiez les règles d'accès Directory·Location d'Apache, les permissions de lecture des fichiers et d'accès au répertoire parent, les paramètres des liens symboliques, ainsi que les fichiers index par défaut et les politiques de listing des répertoires. Ne permettez pas l'accès à tout de manière aléatoire ou n'activez pas le listing des répertoires pour supprimer l'erreur, car cela pourrait exposer des fichiers que vous ne souhaitez pas rendre publics ; vérifiez plutôt d'abord les fichiers et politiques réellement nécessaires.