Domanda

Ho due server Apache che eseguono PHP. Uno accetta barre rovesciate nella stringa di query e le passa a PHP nel modo previsto, ad esempio:

http://server/index.php?url=http://foo.bar

funziona e in PHP questa espressione è vera:

Ho due server Apache che eseguono PHP. Uno accetta barre rovesciate nella stringa di query e le passa a PHP nel modo previsto, ad esempio:

http://server/index.php?url=http://foo.bar

funziona e in PHP questa espressione è vera:

<*>

Tuttavia, nell'altro altro server Apache, lo stesso URL genera un errore 403 proibito ! Tieni presente che se la stringa di query ha l'escaping corretto dell'URL (ovvero con % 2F invece di barra), allora tutto funziona.

Chiaramente c'è qualche differenza nella configurazione di Apache o PHP che causa questo, ma non riesco a capire cosa!

Voglio accettare questa forma di URL in entrambi i casi, non rifiutarla.

REQUEST['url'] == "http://foo.bar"

Tuttavia, nell'altro altro server Apache, lo stesso URL genera un errore 403 proibito ! Tieni presente che se la stringa di query ha l'escaping corretto dell'URL (ovvero con % 2F invece di barra), allora tutto funziona.

Chiaramente c'è qualche differenza nella configurazione di Apache o PHP che causa questo, ma non riesco a capire cosa!

Voglio accettare questa forma di URL in entrambi i casi, non rifiutarla.

È stato utile?

Soluzione

http: //server/index.php? url = http: //foo.bar non è un URL valido. Devi codificare le barre. Penso che i browser lo facciano automagicamente, quindi forse stavi testando con browser diversi?

O forse è l'impostazione AllowEncodedSlashes ?

Altri suggerimenti

Alcuni post suggeriscono che l'utilizzo del PO è errato, il che è falso.

Espandendo il commento di Sam152, le stringhe di query possono contenere entrambe? e / caratteri, vedere la sezione 3.4 di http://www.ietf.org/rfc/rfc3986.txt , che è fondamentalmente la specifica scritta da Tim Berners-Lee e dagli amici che regolano il funzionamento del web.

Il problema è che i parser scritti male (o mal configurati o usati in modo improprio) interpretano le barre della stringa di query come componenti del percorso di separazione.

Ho visto esempi della funzione pathinfo di PHP utilizzata per analizzare gli URL. Pathinfo non è stato scritto per analizzare un URL. È comunque possibile estrarre il percorso utilizzando parse_url, quindi utilizzare fileinfo per recuperare i dettagli dal percorso. Vedrai che parse_url gestisce / e? nelle stringhe di query va bene.

In ogni caso, il problema generale è che quest'area è scarsamente compresa a tutto tondo, anche tra gli sviluppatori esperti, e la maggior parte delle persone (me compreso fino a poco tempo fa) presume semplicemente che qualsiasi cosa dopo il nome del file debba essere urlencoded, che è chiaramente falso se si prendono in considerazione gli standard.

tl; dr Leggi le specifiche :)

Nella tua configurazione di Apache:

AllowEncodedSlashes On

Per ulteriori informazioni, consultare la documentazione:
http://httpd.apache.org/docs/2.2/mod/ core.html # allowencodedslashes

Modifica: Hmm, potrebbe essere quello che hai già funzionato ... Ho avuto lo stesso problema, e quello che alla fine ha risolto il problema per me è stato semplicemente usare $ _SERVER ['REQUEST_URI'] dato che aveva i dati di cui avevo bisogno.

Non specifichi cosa fa PHP con questo url. Reindirizza a questa pagina o prova a leggerlo?

Probabilmente esiste una regola mod_rewrite per rimuovere le doppie barre, o per qualche altro scopo, che tenta di reindirizzare questo da qualche parte che non dovrebbe.

Forse una regex senza ^ prima di http: //

  

Nota che se la stringa della query è correttamente salvata nell'URL (cioè con% 2F anziché barra rovesciata), allora tutto funziona.

Quindi funziona quando la stringa di query è formattata correttamente e non funziona quando non lo è. Qual è il problema?

Sembra un altro caso di default magic_quotes_gpc. Sul server che causa problemi controlla php.ini e assicurati che

magic_quotes_gpc = Off
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top