API PHP RestFull - Hearder Accept:application/json - retour Error 406 Not Acceptable
Bonjour.
J'ai une API RestFull fournit par une appli PHP 5.6 sur un Apache 2.4.
Point d'entrée par .htaccess avec mod_rewrite. Un vhost est configuré (voir fin du message).
L'appel a l'api se fait avec le header http Accept:application/json.
Le apache est configuré avec le mime_module et
AddType application/x-httpd-php .php
Je ne suis pas du tout un spécialiste de Apache. La configuration est celle fournie par défaut sur les WampServer3.
Le php exécuté positionne le Content-Type:application/json.
Sauf que si je passe dans le RewriteRule ^.*$ api.php [QSA,L] le php n'est pas du tout exécuté. C'est Apache qui prend la décision de renvoyer la 406.
Il semblerait que lors du passage par le RewriteRule, la vérification du header Accept soit effective alors que si j'appelle directement api.php ce n'est pas le cas.
Pour http://api.localhost/api/v1/sprints + Accept:application/json => 406
Pour http://api.localhost/api/v1/sprints + Accept:application/json,application/x-httpd-php => 200
Pour http://api.localhost/api/v1/sprints + Accept:application/x-httpd-php => 200
Pour http://api.localhost/api.php/api/v1/sprints + Accept:portenaouaque=> 200
Comment faire pour éviter ce changement de comportement ?
Pour une requête http propre je dois indiquer un Accept correcte : comment faire pour que Apache ou plutôt le mode Rewrite accepte le header Accept:application/json alors que visiblement il n'est paramétré que pour renvoyer du application/x-httpd-php ? Il doit pouvoir faire les deux.
Note : j'ai déjà essayé dans le .htaccess
Code:
1 2 3 4 5 6 7 8 9 10
| <If "%{HTTP_ACCEPT} == 'application/json'">
Header add Content-Type "application/json"
</If>
----- ou ------
RewriteRule ^.*$ api.php [QSA,L,T=application/json]
----- ou ------
SetEnvIf Accept "application/json" forceAcceptHeader
<IfDefine forceAcceptHeader>
Header add Content-Type "application/json"
</If> |
Annexes :
---- Le .htaccess
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_URI} ^/api/(.*)$
RewriteRule ^.*$ api.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^.*$ index.php [QSA,L]
</IfModule> |
----- le vhost
Code:
1 2 3 4 5 6 7 8 9
| <VirtualHost *:80>
ServerName api.localhost
DocumentRoot c:/applications/webserver/www/_oft/oft2-api/public
<Directory "c:/applications/webserver/www/_oft/oft2-api/public/">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require local
</Directory>
</VirtualHost> |