Назад | Перейти на главную страницу

Перезапись местоположений в кодировке ASCII в их эквиваленте в кодировке UTF-8

Например, «å» можно закодировать как /% E5 и /% C3% A5 (utf-8). Все мои имена файлов - UTF-8, поэтому варианты ASCII возвращают 404. Я хочу, чтобы работали оба варианта.

Я попытался переписать неправильные URL-адреса на правильные кодировки с вариантами конфигурации ниже. Мне не удалось сопоставить места, поэтому я никуда не попал.

rewrite ^/%E5$ /%C3%A permanent;
rewrite ^/%25E5$ /%25C3%25A permanent;
location = /%E5 { return 301 /%C3%A; }

Как я могу сопоставить эти процентные закодированные местоположения?

Видеть Вот для той же проблемы в Apache - там я рекомендовал использовать внешнюю программу для обработки перезаписи, так как это неуклюже делать в собственной конфигурации.

Для nginx лучшим подходом может быть встраивание некоторого Perl в вашу конфигурацию через ngx_http_perl_module - использовать perl_set чтобы установить переменную в версию UTF-8 $r->uri, используя Encoding модуль (см. Вот) и перепишите (или, возможно, лучше, try_files) к этому.

Редактировать:

Если вы хотите просто сделать это вручную для определенных URL-адресов или определенных символов, тогда вам просто не хватает пары вещей в ваших попытках:

  • Вы работаете с экранированными URL-адресами, тогда как перезапись должна происходить в строке после декодирования экранированных символов.
  • Вы жестко кодируете совпадения для файлов, которые просто специальный символ, а не файлы, содержать особый персонаж

Попробуйте что-нибудь подобное ..

rewrite (*UTF8)^(.*)\xe5(.*)$ %1å%2;