web-dev-qa-db-fra.com

mod_proxy_html) et un serveur Web défectueux (fournit text / html pour les données JSON)

Nous avons un serveur Web qui répond à AJAX demandes en envoyant des données JSON au client. Le problème est que les données JSON ont le type de contenu "text/html" au lieu de "application/json" (c'est un serveur APEX Oracle, le bogue est reconnu par Oracle, mais ils ne le règlent pas).

Un serveur Web Apache est configuré entre les clients et le serveur en tant que proxy SSL. Ce mandataire analysera désormais toutes les données "text/html" transmises du serveur au client, réécrira les liens si nécessaire et, malheureusement, corrigera également les données html "mal formées". Etant donné que les données JSON envoyées par le serveur sont étiquetées text/html, ces correctifs html sont également appliqués aux données JSON (les balises <html> <body> .. seront ajoutées par exemple), ce qui les rend inutilisables par le client demandeur. (erreurs d'analyse).

Ce que j'ai essayé jusqu'à maintenant

  • /apex/wwv_flow.show est la fonction fournissant des données JSON. J'aimerais que cela soit proxy sans aucune réécriture, alors que le reste de/apex/devrait être proxy "de manière normale".
  • J'ai ajouté "Header set X-Rule -..." uniquement pour déterminer quelle règle <Location> est appliquée.

 <Location "/apex/wwv_flow.show">
    ProxyPass http://192.168.1.100:8080/apex/wwv_flow.show
    Header set "X-Rule-apex-wwv_flow.show" "1"
    Header set Content-Type "application/json"
 </Location>
 <Location /apex/>
    ProxyPass http://192.168.1.100:8080/apex/
    Header set "X-Rule-apex" "1"
    Header always set Cache-Control "no-cache, no-store, max-age=0, must-revalidate" env=nocache
    SetOutputFilter INFLATE;proxy-html;DEFLATE
    ProxyPassReverse /apex/
    ProxyHTMLURLMap /       /apex/
    ProxyHTMLURLMap /apex  /apex
    ProxyHTMLURLMap /apex/ /apex/
    ProxyHTMLDocType '<!DOCTYPE html>'
 </Location>

En conséquence, les données JSON sont désormais étiquetées "application/json", mais aussi HTML-Filtered avec les balises "<html> <body> ...". De plus, les en-têtes "X-Rule…" ("X-Rule-apex" et "X-Rule-apex-wwv_flow.show") sont définis dans le paquet de données qui arrive, ce qui signifie que les deux < Lieu> Les règles ont été appliquées.

  • Existe-t-il un moyen d'indiquer à mod_proxy d'appliquer uniquement <Location "/apex/wwv_flow.show"> s'il convient, puis de l'arrêter?
  • Est-il possible de désactiver la fixation de données HTML "malformées" (globalement)? Je n'ai rien trouvé.
  • Est-il possible d'indiquer à <Location/apex /> d'arrêter le traitement si l'URL contient "wwv_flow.show"? Aussi n'a rien trouvé.
  • Ou existe-t-il une autre option à laquelle je ne peux pas penser pour résoudre le problème?
2
camikusch

Divisez votre emplacement en deux sections:


1. <Location /apex/> - ici vous devriez mettre les options ProxyPassReverse.
2. <Location /apex/(?!wwv_flow\.show)> - celui-ci correspondra à tout autre que /apex/wwv_flow.show


La première section est obligatoire car ProxyPassReverse prend littéralement la place et va devenir fou avec regex. Si vous rencontrez de tels problèmes avec différentes directives, déplacez-les simplement ici.