Caratteri cirillici nelle regole di riscrittura causano errori 404 Not Found

20 gen 2016, 17:46:18
Visualizzazioni: 958
Voti: 3

Ho una regola di riscrittura che include l'URI di una pagina:

(<page-uri>)/someaction/(\d+)

Se l'URI della pagina include caratteri cirillici, come доска-объявлений, la regola viene memorizzata come:

(%d0%b4%d0%be%d1%81%d0%ba%d0%b0-%d0%be%d0%b1%d1%8a%d1%8f%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b9)/someaction/(\d+)

Se vai a una pagina che include un link a un URL che corrisponde alla regola e clicchi sul link, il browser caricherà la pagina di destinazione senza problemi e WordPress è in grado di far corrispondere la regola con l'URL richiesto.

In Safari (Mac), tuttavia, se copi l'URL con Clic Destro > Copia Link e poi provi a caricare la pagina di destinazione incollando l'URL copiato in una nuova scheda, otterrai un errore 404 Not Found.

Quando copi l'URL in Safari, l'URL viene memorizzato con la codifica percentuale usando caratteri maiuscoli per rappresentare gli ottetti dei caratteri cirillici:

%D0%B4%D0%BE%D1%81%D0%BA%D0%B0-%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9/someaction/1

Non sono riuscito a riprodurre il problema in Chrome o Firefox (entrambi su Mac) perché memorizzano l'URL usando caratteri minuscoli per rappresentare gli ottetti.

Quell'URL con codifica percentuale è quello che WordPress riceve attraverso la variabile $_SERVER['REQUEST_URI']. Il problema è che il codice responsabile di confrontare l'URI richiesto con le regole di riscrittura fa un confronto case sensitive (vedi il metodo parse_request in /wp-includes/class-wp.php), rendendo impossibile per WordPress riconoscere la mia regola, anche se

%D0%B4%D0%BE%D1%81%D0%BA%D0%B0-%D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9

e

%d0%b4%d0%be%d1%81%d0%ba%d0%b0-%d0%be%d0%b1%d1%8a%d1%8f%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b9

rappresentano la stessa sequenza di caratteri.

  • Qualcuno sa come prevenire gli errori 404 Not Found quando i browser inviano la richiesta usando ottetti con un case diverso?
  • È qualcosa che WordPress dovrebbe supportare? O dovrei cercare di rimuovere gli URI delle pagine dalle mie regole di riscrittura per evitare il problema?
3
Commenti

E se convertissi manualmente доска-объявлений in URI, e poi aggiungessi prima una regola per il minuscolo, poi convertissi lo stesso URI in maiuscolo e aggiungessi di nuovo la regola?

Kolya Korobochkin Kolya Korobochkin
21 gen 2016 01:59:21
Tutte le risposte alla domanda 1
0

Alla fine ho seguito il consiglio di @Kolya Korobochkin e ho aggiunto versioni maiuscole e minuscole delle regole di riscrittura che includono ottetti codificati.

$regular_page_uri = get_page_uri( $page->ID );

$uppercase_page_uri = preg_replace_callback(
    '/%[0-9a-zA-Z]{2}/',
    create_function( '$x', 'return strtoupper( $x[0] );' ),
    $regular_page_uri
);

Il plugin Percent Encode Capital Letter utilizza un approccio simile per convertire gli ottetti in ogni URL nella loro versione maiuscola. Tuttavia, il plugin è obsoleto e potrebbe non effettuare la conversione in tutti i punti necessari. Inoltre, credo che la maggior parte degli utenti del plugin a cui sto lavorando non avrà URL con ottetti codificati, quindi eseguire preg_replace_callback per tutti gli URL è uno sforzo inutile.

L'uso di caratteri maiuscoli per rappresentare gli ottetti è il modo consigliato per effettuare la codifica percentuale (vedi RFC3986, Sezione 2.1). Quindi una soluzione migliore sarebbe far sì che WordPress aggiorni la sua funzione utf8_uri_encode per codificare gli ottetti utilizzandoli. La maggior parte dei browser che ho testato sembra mantenere il caso originale, mentre altri, come Safari, lo convertono in maiuscolo se ne hanno l'opportunità.

22 gen 2016 18:56:13