Intereting Posts
Получение эскизов пользовательских сообщений с изображениями в шаблонах шаблонов страниц Возможно ли установить два почтовых плагина на одном сайте WordPress? Как это сделать? Создание двух тем для создания полного сайта Отображение подкатегорий родительского продукта в продуктах – woocommerce Как добавить кнопку в панель инструментов quicktags? Как найти, какой сбой плагина Как получить подписной ключ или идентификатор, используя подписки Woocommerce Отображение заказов Woocommerce для конкретного автора Есть ли инструкция if, которая может определить, является ли сообщение в цикле последним? Комбинация пользовательских сообщений и таксономия Нужен метод, чтобы предотвратить добавление WP между моими shortcodes Ясность, необходимая для использования нескольких 403 запрещенных функций header () в начале файлов плагинов Получить первый пост Гравитация формирует несколько сообщений, сгенерированных одной формой Добавление категории в четные позиции на основной петле с измененной разбиением на страницы

Кириллические символы в правилах перезаписи вызывают ошибки 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 страницы из правил перезаписи, чтобы избежать проблемы?

Я закончил следующий совет @ 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, преобразуют его в верхний регистр, если они получают шанс.