Intereting Posts
как перевести меню WordPress и плагины Кэш страниц для категорий, не обновляемых с помощью W3 Total Cache Могу ли я получить разные ссылки для разных установленных тем? Изменение значений в разных файлах Следующий и / или предыдущий пост-контент Та же база данных; разные WordPress Как я могу сделать свои сообщения на моей домашней странице, просто покажите резюме? Получите только один комментарий за сообщение с get_comments Можно ли направить пользователей на определенную должность на основе пароля, введенного на домашней странице? загрузить / потребовать определенные файлы php для определенных страниц / шаблонов / типов сообщений Довольно постоянные ссылки, возвращаемые «не найдены» на локальном хосте и сервере Как добавить параметр в ссылки <a> в навигационном меню? Проблема в If else условие Управление настраиваемым контентом get_option & update_option для нескольких полей ввода с тем же именем

Кириллические символы в правилах перезаписи вызывают ошибки 404 Not Found

У меня есть правило перезаписи, которое включает URI страницы:

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

Если URI страницы содержит кириллические символы, такие как доска-объявлений , правило сохраняется как:

 (%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+) 

Если вы перейдете на страницу, содержащую ссылку на URL-адрес, соответствующий правилу, и вы щелкните по ссылке, браузер загрузит целевую страницу без проблем, и WordPress сможет сопоставить это правило с запрошенным URL-адресом.

Однако в Safari (Mac), если вы скопируете URL-адрес с правой кнопкой мыши> Скопировать ссылку, а затем попробуйте загрузить целевую страницу, вставив скопированный URL-адрес в новую вкладку, вы получите ошибку 404 Not Found.

Когда вы копируете URL-адрес в Safari, URL-адрес хранится с процентным кодированием с символами, используемыми для представления октетов для кириллических символов, все в верхнем регистре:

 %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 

Я не смог воспроизвести проблему в Chrome или Firefox (оба Mac), потому что они оба сохраняют URL-адрес, используя строчные буквы для представления октетов.

Этот URL с процентным кодированием – это то, что WordPress получает через переменную $_SERVER['REQUEST_URI'] . Проблема заключается в том, что код, отвечающий за соответствие запрошенному URI с правилами перезаписи, делает сравнение с регистром (см. Метод /wp-includes/class-wp.php в /wp-includes/class-wp.php ), что делает невозможным, чтобы WordPress /wp-includes/class-wp.php мое правило, хотя

 %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 

а также

 %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 

представляют одну и ту же последовательность символов.

  • Кто-нибудь знает, как предотвратить ошибки 404 Not Found, когда браузеры отправили запрос с использованием октетов с другим случаем?
  • Это что-то WordPress должен поддерживать? или я должен попытаться удалить URI страницы из правил перезаписи, чтобы избежать проблемы?

Solutions Collecting From Web of "Кириллические символы в правилах перезаписи вызывают ошибки 404 Not Found"

Я закончил следующий совет @ Kolya Korobochkin и добавил прописные и строчные версии правил перезаписи, которые включают экранированные октеты.

 $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 ); 

Плагин Percent Encode Capital Letter использует аналогичный подход для преобразования октетов в каждый URL-адрес в свою версию в верхнем регистре. Однако плагин устарел и, возможно, не выполняет преобразование во всех необходимых местах. Кроме того, я считаю, что большинство пользователей плагина, над которым я работаю, не будут иметь URL с закодированными октетами, поэтому запуск preg_replace_callback для всех URL-адресов является ненужным.

Использование символов верхнего регистра для представления октетов – рекомендуемый способ выполнения процентного кодирования (см. RFC3986 , раздел 2.1). Поэтому лучшим решением было бы заставить WordPress обновить свою функцию utf8_uri_encode чтобы избежать использования октетов. Большинство браузеров, которые я тестировал, похоже, сохраняют исходный случай, в то время как другие, такие как Safari, преобразуют его в верхний регистр, если они получают шанс.