Non conosco il codice del progetto di cui tu parli ma urlencode va usato dopo aver suddiviso la url in due parti , la seconda parte é la query string.
rawurlencode dalla cartella root al nome file. (più specificatamente devi sostiure lo spazio bianco in %20 la funzione rawurlencode fa questo , successivamente %2F in / (é ovvio non potrai mai usare caratteri come %/#?=& o qualunque separatore usato dal proprio web server arg_separator input output etc. poiché fanno parte del dopo di una cartella) e se vuoi essere conforme la url deve essere equivalente a UTF-8 così puoi adottare il percent enconding sul singolo byte e nel browser vedrai i caratteri utf-8... La cartella deve esistere e avere il pieno controllo con quei caratteri ma molti webser hanno problemi con caratteri al di fuori di US-ASCII) Dai nuovi Browser che interpretano qualsiasi carattere al di fuori di US-ASCII a UTF-8 .
Questo é vero la maggior parte delle volte e va applicato se il proprio applicativo non indica come trattare le url.
Stai usando parse_url con schema, host, porta etc, la query string é presente lì, inoltre quando da PHP recuperi il valore di GET, POST (REQUEST) o COOKIE (con setcookie viene trasformato con urlencode) verrà applicato urldecode.
Devi applicare urldecode alla query string se la stringa (url) é nel giusto output.
Referenza sintassi IRI che con regole severe può essere trasformata in URI
https://tools.ietf.org/html/rfc398
Segue un esempio surreale (lascio inalterato = e & poiché la query string inizia da ? ed é composta dai caratteri citati)
Non va usato é qui per completezza.
<?php
function my_func( $url ) {
$var = parse_url( $url );
// https://, default http://
$var['scheme'] = $var['scheme'] ? ( ( substr( strtolower( $var['scheme'] ), 0, 5 ) === 'https' ) ? 'https://' : ( substr( strtolower( $var['scheme'] ), 0, 4 ) === 'http' ) ? 'http://' : 'http://' ) : 'http://';
$var['path'] = rawurldecode( $var['path'] );
$arg_output = '&';
$char = urlencode( $arg_output );
$var['query'] = urldecode( str_replace( array( '%25', $char, $arg_output, '%3D', '%3d', '=' ), array( '%25%25', '%25' . $char, $char, '%25%3D', '%25%3d', '%3D' ), $var['query'] ) );
$var['query'] = str_replace( array( '%25', '%%', '%' . $arg_output, '%=' ), array( '%25%25', '%25', $char, '%3D' ), $var['query'] );
$var['query'] = strtr( $var['query'], array( '%25%25' => '%25', '%25' => '%' ) );
return $var;
}
$url = 'http://example.com/test%201/file.php?a=Hello+friend+%25&b=how+are+you%3Fyou%26me';
// Output http://example.com/test 1/file.php?a=Hello friend %&b=how are you?you%26me';
$output = my_func( $url );
var_dump( $output );
Nella url originale hai caratteri ? = & (%3F (%3D %26 o & o & dentro la query) ) al di fuori della query string?