# Apache/Problèmes connus

* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
[ Modifier le sommaire ]

## Logs

Contrairement à ce qui est dit quand Apache bloque au démarrage, il ne faut pas utiliser journalctl -xe pour lire les logs car il tronque chaque ligne à 125 caractères. Il faut lancer :
Si les logs ne sont pas assez détaillé, on peut augmenter leur verbosité dans le vhost :

## Lecture seule

S'il est impossible de créer des fichiers ou répertoires depuis un navigateur c'est que le serveur n'autorise pas l'utilisateur apache à le faire dans le répertoire du site.

## La liste des fichiers apparait au lieu de lancer index.html

Remplacer
par

## Les fonctions PHP s'affichent sur la page au lieu de s'exécuter

Si a2enmod php7.2 indique que le module est déjà installé, c'est peut-être lié à a2enmod userdir. Cela peut se régler avec :
Commenter les lignes :
Et relancer Apache.

## Erreurs
### 403 forbidden, client denied by server configuration

Ce message apparait dans les logs Apache quand le fichier auquel on tente d'accéder est protégé dans apache2.conf, par un deny, un require ou une absence de ce dernier. Dans ce cas, il faut l'ajouter :

### 403 forbidden, You don't have permission to access / on this server

Si les logs parlent de liens symboliques : Too many levels of symbolic links ou Symbolic link not allowed or link target not accessible, remplacer le chemin du site vers lequel pointe le vhost par un dossier qui n'est pas un lien symbolique.
Si les logs parlent de No matching DirectoryIndex (index.html) found, c'est certainement que l'index.php ne s'exécute pas parce que PHP est mal configuré.

### Configuration error: No MPM loaded

Restaurer le apache2.conf d'origine, il doit y avoir une erreur dans la directive ServerRoot.

### Load denied by X-Frame-Options: ... does not permit cross-origin framing

Il faut juste autoriser les iFrames vers votre site, en commentant dans apache2.conf la ligne qui commence comme :

### Missing suexec binary

Installer le module :

### suEXEC is disabled

Vérifier que le module est activé.

## Erreurs vhost

Les problèmes suivants peuvent survenir lors des relances Apache.

### Invalid command 'SuexecUserGroup'

Vérifier que le module est activé.

### apache2: bad user name Utilisateur1

Un utilisateur Unix appelé dans la configuration n'existe pas. Il faut donc le créer :

### apache2: bad group name Groupe1

Un groupe Unix appelé dans la configuration n'existe pas. Il faut donc le créer :

### No such file or directory:... Cannot access directory '/etc/apache2/logs/'... Configuration check failed

Un répertoire Unix appelé dans la configuration n'existe pas. Il faut donc le créer :

### exit signal Segmentation fault (11)

Cela peut survenir quand PHP rencontre une erreur. Pour la connaitre précisément, il faut lancer le .php en shell (sans Apache). Exemple :

### Got error Primary script unknown

Le fichier .php vers lequel renvoie le vhost n'existe pas (404). Sinon il faut ajouter au vhost DirectoryIndex index.php.

## Erreurs HTTPS
### Échec de la connexion sécurisée. SSL a reçu un enregistrement qui dépasse la longueur maximale autorisée. (Code d'erreur : ssl_error_rx_record_too_long)

Le module d'Apache est activée mais son vhost est absent ou sa configuration ne contient pas SSLEngine on.

### curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Il faut refaire comme il faut la configuration Apache ci-dessus.

### curl: (60) SSL certificate problem: self signed certificate

C'est que la connexion fonctionne, les visiteurs doivent juste acquitter le message de leur navigateur Cette connexion n'est pas certifiée.
Sinon, ajouter un vhost sur le port 443 en plus du 80.

### cURL error 60: SSL certificate: unable to get local issuer certificate

Il faut signer son certificat avec un autre.
Si l'erreur vient de PHP, il faut ensuite renseigner le certificat CA dans deux champs du php.ini.

### Enter passphrase for SSL/TLS keys for à chaque relance Apache

Vérifier la présence de la ligne suivante dans la configuration : SSLPassPhraseDialog exec:/etc/ssl/nomdedomaine.fr.pwd. Sinon, fdaire sauter le mot de passe :

### Blocage du contenu mixte actif (mixed active content) / Blocage du chargement du contenu mixte actif (mixed active content)

Il faut remplacer HTTP par HTTPS dans le code source du site Web.

### Dans les logs SSL
#### RSA certificate configured for 127.0.0.1:443 does NOT include an ID which matches the server name

Il faut générer la clé en utilisant un FQDN.

#### CSR contains unsupported extensions

Le mot de passe du .csr contient des caractères spéciaux incompatibles, comme ! ou _. Il faut se contenter de l'alphanumérique.

### Dans les logs Apache
#### Server should be SSL-aware but has no certificate configured

Réinstaller clé SSL.

#### Init: Unable to read server certificate from file ...csr

Le .cert est introuvable.

#### SSL Library Error: error:0906D06C:PEM routines:PEM_read_bio:no start line (Expecting: TRUSTED CERTIFICATE) -- Bad file contents or format - or even just a forgotten SSLCertificateKeyFile?

Il faut convertir le certificat SSL ainsi :
Sinon il faut retirer les BOM du certificat.
Sinon il faut retirer les autres fichiers du dossier contenant la clé et de celui du certificat (un autre), en leur conférant au maximum du chmod -R 644.

#### Certificate and private key do not match

Le certificat doit être un fichier .pem et la clé .key. Il est possible de le vérifier avec la commande suivante :
Quand les deux certificats correspondent il n'y a qu'une seule ligne, comme ci-dessus. Il faut donc retrouver le bon ou régénérer la paire. Pour y voir plus clair, la commande file permet de les identifier :

#### AH00016: Configuration failed

Ce message peut survenir au redémarrage d'Apache si un vhost est incorrect. Par exemple si SSLCertificateFile ne correspond à pas SSLCertificateKeyFile.

#### AH01909: nomdedomaine.fr:443:0 server certificate does NOT include an ID which matches the server name

Le certificat installé est prévu pour un autre domaine ou sous-domaine. Il faut peut-être en acheter un pour tous les sous-domaines, ce qui se dit certificats SSL à validation de domaine (wildcard certificate en anglais).

#### Pass phrase incorrect for key

Soit on peut regénérer le fichier de la directive SSLPassPhraseDialog, soit on fait sauter le mot de passe demandé par la clé : openssl rsa -in privateAvecPassPhrase.key -out private.SansPassPhrase.key.

## Erreurs .htaccess
### Inopérant

Si le .htaccess ne produit aucune redirection, vérifier que le module Apache est bien activé :
Et que la directive suivante figure au moins dans un répertoire parent du .htaccess :
Puis relancer Apache.
Dans le vhost du site, remplacer "*:80" par "IP_du_serveur:80".

### Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

Il existe une redirection circulaire.

## Erreurs CGI
### Error 500 Erreur du serveur!

Remplacer un Deny from all par un Allow from all. Sinon, regarder les logs. Par exemple, cela peut provenir de suexec policy violation => commenter la directive SuexecUserGroup.

### Error 403 Accès interdit

Lister ce répertoire est interdit, il faut donc connaitre l'URL des fichiers qu'il contient.
* Le code source du fichier à exécuter s'affiche dans le navigateur, ou ce dernier propose de le télécharger : le Addhandler est manquant (exemple dans le .htaccess ci-dessus). Sinon c'est le module qui n'est pas activé (a2enmod cgi).

### couldn't create child process

Remplacer le chemin après le shebang. Par exemple :
* #!/usr/bin/perl par #!c:/perl/perl/bin/perl.exe -w.
* #!/usr/bin/env python par #!C:\Program Files (x86)\Python\python.exe.

### End of script output before headers

En-tête manquante dans le contenu affiché par le script (ex : déplacer l'importation avant print "Content-Type: text/plain;charset=utf-8"). Mais cela peut aussi être dû à un message d'erreur dans le script à exécuter.

### malformed header from script: Bad header:

L'en-tête n'est pas adaptée (ex : remplacer #print "Content-Type: text/plain;charset=utf-8" par print "Content-type: text/html\n\n" s'il y a un print "<html>" après).
Sinon consulter les logs Apache...

## Références

* ↑ https://httpd.apache.org/docs/2.4/fr/logs.html
* ↑ https://github.com/x3rus/training/blob/master/setup-un-CA/01-introduction.md
* ↑ https://openclassrooms.com/forum/sujet/configurer-le-fichier-curlhttpclient
* ↑ https://www.certificats-ssl.com/support/Installation-dun-certificat-avec-Apache-httpd.html
* ↑ http://stackoverflow.com/questions/23652680/postfix-cannot-get-rsa-private-key-from-file-etc-ssl-private-server-key-disabl