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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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>