Nginx упорядочивает параметры get в алфавитном порядке

У нас есть производственный сайт, на котором работают Nginx и WordPress. Я передаю этот запрос в файл wp-admin / load_styles.php:

wp-admin/load-styles.php
    ?c=0
    &dir=ltr
    &load%5B%5D=dashicons,admin-bar,common,forms,admin-menu,dashboard,list-tables,edit,revisions,media,themes,about,nav-menus,wp-pointer,widgets
    &load%5B%5D=,site-icon,l10n,buttons,wp-auth-check
    &ver=4.9.8

Теперь, когда я выводю переменные $_SERVER, я вижу следующее:

[QUERY_STRING] => 
    c=0
    &dir=ltr
    &load%5B%5D=,site-icon,l10n,buttons,wp-auth-check
    &load%5B%5D=dashicons,admin-bar,common,forms,admin-menu,dashboard,list-tables,edit,revisions,media,themes,about,nav-menus,wp-pointer,widgets
    &ver=4.9.8

Как видите, два элемента в массиве load[] поменялись местами (потому что Nginx или что-то еще на сервере сортирует параметры по алфавиту). В load_styles.php массив загрузки объединен. Это приводит к этой строке для загрузки:

,site-icon,l10n,buttons,wp-auth-checkdashicons,admin-bar,common,forms,admin-menu,dashboard,list-tables,edit,revisions,media,themes,about,nav-menus,wp-pointer,widgets

вместо

dashicons,admin-bar,common,forms,admin-menu,dashboard,list-tables,edit,revisions,media,themes,about,nav-menus,wp-pointer,widgets,site-icon,l10n,buttons,wp-auth-check

Это, в свою очередь, приводит к тому, что wp-auth-check и дашиконы никогда не загружаются.

Я не могу взломать способ загрузки этих стилей, поэтому мне интересно, знает ли кто-нибудь о настройке в Nginx, где я могу отключить алфавитную сортировку GET-параметров.

  • NGINX сортирует параметры в алфавитном порядке перед их передачей в PHP?
  • Почему ну почему?
  • Как мне его выключить? Это портит массив, который отправляется через GET-параметры в определенном порядке, с которым нельзя связываться.

Я не могу воспроизвести это, возможно, это настройка, специфичная для вашего сервера? Однако в зависимости от порядка решение может показаться хрупким.

jeroen 10.08.2018 16:27

Если вы хотите отправить массив, почему бы просто не использовать синтаксис массива? Если вы отправите a[0]=1&a[1]=2&a[2]=3, у вас будет массив, который вы можете использовать из PHP в $_GET['a']

Zach Bloomquist 10.08.2018 16:35

Я бы сказал, что если ваши параметры должны быть в определенном порядке, вы должны использовать параметры пути (например, /test/1/2) вместо строки запроса. В спецификации HTTP нет ничего, что требовало бы, чтобы веб-сервер анализировал и пересылал строку запроса в том порядке, в котором она была отправлена.

iainn 10.08.2018 16:42

Используете ли вы PHP-фреймворк на этом сервере или что-то еще, что может взаимодействовать с маршрутизацией, кроме NGINX?

Philipp Maurer 10.08.2018 16:45

Я сильно подозреваю, что это XY проблема. Не должно быть никаких причин для заказа строки запроса. Что делает рассматриваемый код?

Machavity 10.08.2018 16:56

Я обновил вопрос. Я считал себя умным, упрощая свой вопрос. Видимо, ошибся :)

rasmusrim 13.08.2018 08:21
3
6
132
0

Другие вопросы по теме