Cos’è arg_separator.output e perché conta
arg_separator.output è un’impostazione di PHP che definisce il separatore usato quando PHP costruisce gli URL con parametri di query. In pratica decide quale carattere viene inserito tra i parametri generati da funzioni come http_build_query() o da alcune librerie che affidano a PHP la composizione della stringa finale.
Il valore più comune è &, cioè il classico separatore degli URL. In alcuni contesti viene usato & quando si vuole ottenere un output già adatto all’HTML, ma questa scelta va fatta con attenzione: non è una regola universale, e impostare il valore sbagliato può produrre link strani, doppie codifiche o parametri non interpretati correttamente.
La regola pratica è semplice: se stai lavorando con URL destinati a essere usati come URL, il separatore deve essere il carattere reale &. Se invece stai stampando direttamente l’URL dentro un documento HTML e non fai escaping separatamente, devi ragionare sul flusso completo dell’output, non solo su questa direttiva.
Quando serve davvero modificarlo
In molti siti non serve toccarlo affatto. Il valore di default è già corretto nella maggior parte degli ambienti. La modifica diventa utile soprattutto in questi casi:
- una libreria o un CMS genera URL con separatori non coerenti con il template;
- stai migrando un vecchio sito che si aspetta un formato specifico;
- hai bisogno di uniformare l’output tra ambienti diversi;
- stai analizzando un problema di link generati male, soprattutto in pagine dinamiche o in email HTML.
Prima di cambiare il valore, però, conviene verificare se il problema è davvero legato a questa direttiva. Molto spesso l’errore nasce da un doppio escaping dell’HTML, da una funzione che concatena URL in modo errato o da un plugin che gestisce male i parametri.
Verifiche preliminari
Il controllo più rapido è leggere il valore attuale di PHP. Se hai accesso al terminale, puoi usare:
php -i | grep -i 'arg_separator.output'
In alternativa, puoi creare un file temporaneo con phpinfo() oppure usare il pannello del server se disponibile. L’esito atteso è vedere il valore realmente in uso, non quello che pensi di aver impostato. In ambienti con più versioni PHP o con FPM separati, è facile modificare un file e poi accorgersi che il sito usa un’altra configurazione.
Se lavori su WordPress, Joomla, Drupal o un framework, controlla anche se il CMS ha già un layer di escaping. Se l’URL viene stampato nel template con funzioni dedicate, la direttiva PHP spesso è irrilevante e il problema va corretto a livello applicativo.
Come configurarlo: il metodo più sicuro
Il modo migliore dipende dall’ambiente. La scelta più sicura e reversibile è quasi sempre agire nel file di configurazione giusto, senza toccare altro.
1. Verifica quale PHP stai usando
Prima di tutto identifica la versione e il gestore PHP effettivo. Su server Linux puoi controllare la CLI con:
php -v
Ma attenzione: la CLI può usare una configurazione diversa da quella del sito web. Se il sito gira con PHP-FPM, con cPanel, Plesk o FastPanel, il valore va impostato nel profilo PHP del dominio o nel file di configurazione caricato da quel pool.
2. Modifica il file corretto
Le opzioni più comuni sono queste:
- php.ini: scelta classica quando hai accesso alla configurazione globale o di versione;
- .user.ini: utile su hosting condiviso o ambienti con PHP-FPM che leggono configurazioni per-directory;
- .htaccess: funziona solo in casi specifici con mod_php, quindi oggi è spesso meno affidabile;
- pannello hosting: il metodo preferibile quando disponibile, perché riduce gli errori di percorso e versione.
Il valore corretto da impostare, nella maggior parte dei casi, è:
arg_separator.output = &
Se devi scrivere il valore in un file ini, il carattere non va interpretato come HTML, quindi basta il simbolo reale &. Se il file è usato per generare output HTML, non confondere questa direttiva con l’escaping del template.
3. Esempio con php.ini
Se hai accesso al file di configurazione PHP, individua il file corretto e fai prima un backup:
cp /percorso/php.ini /percorso/php.ini.bak
Poi aggiungi o modifica la riga:
arg_separator.output = &
Dopo la modifica, riavvia il servizio PHP-FPM o il web server se necessario. L’esito atteso è che il nuovo valore sia letto dalla versione PHP usata dal sito.
4. Esempio con .user.ini
Se sei su hosting condiviso o non puoi toccare il file globale, crea o modifica il file .user.ini nella root del sito:
arg_separator.output = &
Questa soluzione è spesso la più pratica su ambienti moderni, ma richiede tempo perché PHP rilevi il cambio. In alcuni casi la cache della configurazione viene aggiornata dopo alcuni minuti.
5. Esempio con cPanel, Plesk e FastPanel
In cPanel, cerca Select PHP Version o MultiPHP INI Editor, seleziona il dominio e modifica il valore della direttiva se disponibile. In molti setup il pannello consente di cambiare i parametri senza intervenire a mano sui file.
In Plesk, vai su Siti Web e Domini, apri Impostazioni PHP e verifica se il parametro può essere impostato da interfaccia oppure tramite file di configurazione locale.
In FastPanel, entra nel sito, apri le impostazioni PHP e controlla la sezione dedicata ai parametri ini personalizzati. Se il pannello espone un campo per le direttive, è il modo più pulito per applicare la modifica.
Il vantaggio del pannello è che la modifica resta legata al dominio o al pool corretto, evitando di cambiare la configurazione globale per errore.
Se non funziona: cause frequenti
Se imposti il valore ma non cambia nulla, di solito il problema è uno di questi:
- stai modificando il file sbagliato, cioè una configurazione non usata dal sito;
- PHP-FPM o il servizio web non è stato ricaricato dopo la modifica;
- un override locale nel virtual host o nel pool PHP sovrascrive il valore;
- il CMS o il plugin genera gli URL con una logica propria, ignorando la direttiva;
- la cache applicativa o opcode cache ti mostra ancora il vecchio comportamento.
Per verificare il valore effettivo, il controllo migliore è sempre quello lato web, non solo da CLI. Puoi creare un piccolo file temporaneo, ad esempio check.php, con questo contenuto:
<?php echo ini_get('arg_separator.output');
Apri il file dal browser, leggi il risultato e poi elimina il file appena finito. L’esito atteso deve coincidere con il valore impostato nel pannello o nel file di configurazione. Se non coincide, la configurazione in uso non è quella che pensi.
Relazione con http_build_query()
Molti confondono arg_separator.output con il comportamento di http_build_query(). In realtà la direttiva influisce proprio su come PHP costruisce la query string. Questo significa che se una funzione crea un URL con parametri, il separatore finale dipende da questa impostazione, salvo override espliciti nel codice.
Un esempio semplice:
<?php
$params = ['a' => 1, 'b' => 2];
echo http_build_query($params);
Se arg_separator.output è impostato a &, il risultato sarà simile a a=1&b=2. Se invece fosse impostato diversamente, il separatore cambierebbe di conseguenza. Questo è utile solo quando il tuo flusso applicativo ha davvero bisogno di un formato diverso; in caso contrario, lascia il valore standard.
Attenzione all’HTML e all’escape
Qui nasce il punto più delicato. L’URL da solo e l’URL dentro HTML non sono la stessa cosa. Se stampi un link in una pagina, il carattere & nell’attributo href dovrebbe essere gestito correttamente dal motore di template o dalla funzione di escape. Non devi risolvere la cosa forzando arg_separator.output su valori strani.
La soluzione corretta è questa: usa il separatore naturale negli URL, poi applica l’escaping HTML nel punto di output. In un CMS ben scritto, questo è già gestito. Se il tuo tema o plugin mostra URL spezzati, il problema è spesso nel codice di output, non nella direttiva PHP.
In breve: arg_separator.output decide come PHP scrive la query string; l’escaping HTML decide come quella stringa va resa sicura nel browser. Sono due livelli diversi.
Metodo pratico consigliato
Se vuoi una procedura rapida e pulita, segui questo ordine:
- controlla il valore attuale con
ini_get()ophpinfo(); - identifica il file o il pannello che governa il PHP del sito;
- fai un backup della configurazione prima di toccarla;
- imposta
arg_separator.output = &se ti serve il comportamento standard; - verifica il risultato lato browser e non solo in CLI;
- svuota eventuali cache applicative o opcode cache se il valore non si aggiorna subito.
Questo approccio evita modifiche casuali e ti permette di capire subito se il problema è nella direttiva, nel template o nel CMS.
Esempio di controllo finale
Dopo la modifica, verifica con un test concreto. Ad esempio, crea una pagina che genera un URL con parametri e controlla che il risultato sia coerente:
<?php
echo http_build_query(['page' => 2, 'sort' => 'date']);
Il risultato atteso, nella configurazione standard, è una stringa con & tra i parametri. Se nel browser vedi caratteri strani o entità HTML non volute, la correzione non va fatta qui: va rivisto il codice che stampa il link.
Rollback rapido
Se dopo la modifica noti un comportamento anomalo, il rollback è semplice: ripristina il backup del file di configurazione o disattiva il parametro dal pannello. Poi verifica di nuovo il valore con lo stesso test usato prima. Se il sito usa cache, svuotala prima di trarre conclusioni, perché un valore vecchio può restare visibile per qualche minuto.
In caso di dubbio, la scelta più sicura è tornare al valore standard &. È la configurazione più compatibile con PHP, con i browser e con la maggior parte dei CMS.
Conclusione operativa
arg_separator.output è una direttiva semplice, ma va trattata con precisione. Non è un interruttore magico per correggere gli URL: serve a definire il separatore usato da PHP nella costruzione della query string. La configurazione corretta, nella maggior parte dei casi, è &, applicata nel file o nel pannello giusto, con verifica finale lato web.
Se il problema nasce in un CMS o in un tema, correggi prima il flusso di output e l’escaping. Se invece stai uniformando un ambiente legacy o un server con più versioni PHP, la modifica alla direttiva è legittima, purché sia fatta nel punto giusto e validata dopo l’intervento.
Commenti (0)
Nessun commento ancora.
Segnala contenuto
Elimina commento
Eliminare definitivamente questo commento?
L'azione non si può annullare.