Voici donc d'autres détails derrière cette question ... p>
J'ai deux systèmes de deux fournisseurs différents, à la fois exclusifs. Nous les appellerons au système A et System B. Les deux systèmes fonctionnent en tant qu'entités autonomes, mais le système B fournit une fonctionnalité supplémentaire et très spécifique qui manque de système A. Le fournisseur derrière le système B s'intègre au système A sur un niveau plutôt basique (système B S'intègre d'autres systèmes de fournisseurs similaires au système A dans le même marché). Bien que le système B est une application pilotée PHP, le système A n'est pas. La méthode d'intégration fait quelque chose comme ceci: p>
Système B exporte un fichier de contrôle structuré (alignez un fichier texte) contenant diverses paires de paramètres / valeur. Le système A est conçu pour importer le fichier de contrôle dans le système A. Système A prend les données dans le fichier de contrôle, le combine avec certaines de ses propres données et construit une URI. Cette URL est présentée sous forme de lien cliquable par l'utilisateur sur la page appropriée du système A. C'est cet URI qui contient le double '?' dans la chaîne de requête. Cette même URI contient ce que je ne peux décrire que comme une URI post-back (une URI spécifique sur le système A pour recevoir des données du système B, formant une communication bidirectionnelle). P>
L'action utilisateur du clic sur le lien effectue les éléments suivants: p>
Étape 1: Système A passe une série de paramètres et de valeurs au système B dans la chaîne de requête à 'fichier.php'. p>
Étape 2: Système B reçoit les données du système A, effectue une certaine validation et ce qui n'écrit pas des informations dans la base de données, et dans le processus SPAWNS Une nouvelle fenêtre de navigateur enfant séparée du système A. L'utilisateur va alors sur leur Travailler au sein du système b. P>
Étape 3: Lorsque l'utilisateur est terminé avec la tâche dans le système B et soumet son travail, le système B passe une série de paramètres et de valeurs vers le système A via l'URI post-back. Système A effectue une certaine validation, écrit les résultats dans la base de données, puis émet une commande au système B pour mettre fin à la session (pendant que je dis une session, ce n'est pas ce que vous penseriez d'une vraie session car il n'y a pas d'informations sur l'état) et du système B ferme la fenêtre de l'enfant. P>
La majorité du temps, ce processus fonctionne. Les deux fournisseurs appuient ce processus. Cependant, ce processus échoue parfois à l'étape 1 ou à l'étape 3. L'échec présente une erreur difficile (comme à l'étape 1) par le système B, car elle ne reçoit pas les informations dont il a besoin et s'attend dans la chaîne de requête, ou Erreur par quel système B envoie ses données au système A (comme à l'étape 3), mais le système A échoue à récupérer les données. Cette dernière erreur ne présente pas à l'utilisateur, ni ne génère des données de journal d'erreur. Cela n'existe tout simplement pas. Nous ne le savons qu'à ce sujet après le fait que l'utilisateur a l'air dans le système A pour leur travail et il n'y a rien là-bas. P>
Et comme il était déjà élevé, le système A effectue une URL codée / décodage sur les données de la chaîne de requête. P>
Étant donné que l'erreur est intermittente et que je ne parviens pas à reproduire dans mon environnement d'assurance qualité, je n'ai que des devinettes à partir. P>
5 Réponses :
Selon Section 3.4 de l'URI RFC (# 3986 ): p>
Le composant de requête est indiqué par le premier point d'interrogation ("?") caractère et terminé par un panneau de numéro ("#") ou par le Fin de l'URI. P>
Query = * (Pchaler / "/" / "?") P>
Les caractères slash ("/") et point d'interrogation ("?") peuvent représenter des données dans le composant de la requête. Méfiez-vous que certains plus âgés, erronés Les implémentations peuvent ne pas gérer correctement ces données lorsqu'il est utilisé comme l'URI de base pour les références relatives (section 5.1), apparemment parce que Ils échouent à distinguer les données de requête des données de chemin lors de la recherche de séparateurs hiérarchiques. Cependant, comme des composants de requête sont souvent utilisés transporter des informations d'identification sous la forme de paires de "clé = valeur" et une valeur fréquemment utilisée est une référence à un autre URI, il est parfois mieux pour une convivialité d'éviter tout pourcentage - coder ces caractères. p> blockQuote>
Donc, comme je l'ai lu, un
non codé? code> est autorisé, mais il peut représenter des données, pas nécessairement une transition entre les segments de données. Dans mon expérience limitée, je n'ai jamais vu cela fait dans la pratique. Je pouvais imaginer que certaines des packages d'analyse de la requête d'URL (en particulier à domicile à domicile) pourraient manquer ce détail et potentiellement étrangler quand ils rencontrent un second? Code>. P>.
file.php?parm1=val1&parm2=val2?parm3=val3&⦠No, you shouldn't/can't do this, and it will result in unexpected consequences, which it sounds like you're starting to witness. You will need to find a solution that doesn't create this scenario. If you have an opportunity to create this url and process it's construction, you certainly can use & instead.
a fait des tests rapides à PHP parce que j'étais curieux moi-même. Voici une liste d'URL et ce qui montre en $ _GET à partir de chacun: si fondamentalement, la seconde "?" est toujours traité comme faisant partie des données. Pourrait être prélevé des noms de variables ou causer d'autres problèmes, Dunno. P> P>
Aussi - première chose, je reniflerais tout le trafic réseau pour voir exactement ce qui est transmis. Vous pouvez probablement obtenir la majeure partie de ce dont vous avez besoin de l'onglet Réseau dans Firefox's Firebug. Pour obtenir une vue plus détaillée et la possibilité d'intercepter les demandes HTTP en temps réel, exécutez tout le trafic Internet via un proxy comme Burp Proxy (gratuit).
Oui, ils sont problématiques. p>
Mais puisque votre système fonctionne parfois peut-être que vous pouvez intercepter ces URL de votre serveur Web, par exemple Apache avec mod_rewrite qui vous permettent de rediriger ces URL à un autre script, puis essayez de créer un script Clean_url qui corrigera l'URL ( Transférer à) votre script System B avec le guillemet fixé remplacé par le & caractère. P>
Si vous avez la possibilité de faire la première façon, vous pouvez également le faire à l'inverse. P>
J'espère que cela résout votre problème. P>
Oui, cela ne fonctionnera pas correctement. Ce que vous devez faire est d'utiliser la fonction PHP UrlenCode pour encoder toutes les valeurs lorsque vous formez une URL. Cela fera décoder PHP les valeurs d'origine correctement.
http://www.php.net/htmlspecialchars
tl; dr. Vous auriez pu juste demander si
? Code> peut être substitué à& code> dans une queryching. La réponse est "non" (bien que ça va faire Autres choses i> choses, pas "pause" en soi)