Рубрики
Uncategorized

Nginx устанавливает функцию pathinfo и адаптируется к режиму маршрутизации think p5.

Автор оригинала: David Wong.

Недавно при развертывании проектов, написанных на языках think 5 и centos 7, использовался nginx. После развертывания было обнаружено, что проверочный код не может быть выведен. После волны анализа было обнаружено, что nginx не смог проанализировать правила маршрутизации ThinkPHP, поэтому произошла ошибка 404. Некоторые онлайн-уроки действительно хороши, некоторые действительно копируются и вставляются. Это был долгий путь в обход. Так что запишите свой опыт.

Я использую версию nginx 1.14. В этом развертывании руководство официального веб-сайта действительно важно. Рекомендуется ознакомиться с руководством на официальном сайте. На этот раз я объясню две формы письма.

Первый вид

location / {
        root   /usr/share/nginx/html;
        index  index.php;
    if (!-e $request_filename) {
        rewrite ^/meeting/public/(.*)$ /meeting/public/index.php?s=$1 last;
    }
}       

 

location ~ \.php {
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
     include        fastcgi_params;
 }
 

Давайте взглянем на переписывание первой локации. Официальный сайт объясняет это так: если указанное регулярное выражение соответствует URI запроса, измените URI, как указано в строке замены. Инструкции по перезаписи выполняются в том порядке, в котором они указаны в файле конфигурации.

Короче говоря, URL-адрес преобразуется в соответствии с вашим регулярным выражением. В первом блоке местоположения выше, если URL-адрес/meeting/public/AAA/BBB/CCC, он будет заменен на/meeting/public/index. PHP?/BBB/CCC в соответствии с регулярным выражением, где 1 доллар соответствует (. *) $если у вас несколько регулярных выражений, программа будет назначена $2, $3………., так что думайте, что PHP сможет пройти через $get [‘s’] Возьми это. Затем запрос перенаправляется во второй блок расположения, чтобы к нему можно было получить доступ.

Но есть и недостатки. Если у меня чешется, как насчет того, чтобы написать” как”? Конечно, это бесполезно. Я помню, что ThinkPHP использует?, или я посещаю/собрание/общественность/индекс.php/aaa/bbb/ccc напрямую. Согласно приведенным выше регулярным выражениям, мы обнаруживаем, что это невозможно. Поскольку доступ к первому местоположению вообще отсутствует, но имеется прямой доступ ко второму блоку местоположения, второе местоположение не реализует возможность pathinfo. Доступ не удался.

Обратите внимание, что если второе местоположение-это местоположение ~. PHP ${, не забудьте удалить $.

Второй способ

location / {
        root   /usr/share/nginx/html;
        index  index.php;
        if (!-e $request_filename) {
                rewrite ^/meeting/public/(.*)$ /meeting/public/index.php/$1 last;
        }
    }
    
 location ~ \.php {
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index  index.php;
     fastcgi_split_path_info       ^(.+\.php)(.*)$;
     fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
     fastcgi_param PATH_INFO       $fastcgi_path_info;
     include        fastcgi_params;
 }
 

Первая перезапись местоположения выражает ту же закономерность, что и раньше. Предположим, что URL-адрес/meeting/public/AAA/BBB/CCC, он будет заменен на/meeting/public/index.php/aaa/bbb/ccc в соответствии с регулярностью, а затем он будет перенаправлен во второе местоположение. Во втором расположении используется fastcgi_split_path_info. В руководстве это описывается следующим образом: определите регулярное выражение, которое фиксирует значение переменной $fastcgi ﹐ путь ﹐ информация. Для регулярных выражений должно быть два улова: первый улавливает значение переменной $fastcgi ﹐ script ﹐ name, а второй улавливает значение переменной $fastcgi ﹐ path ﹐ info. Вы можете увидеть объяснение двух переменных на официальном сайте.

Здесь второе местоположение разделено на/meeting/public/index.php/aaa/bbb/ccc в соответствии с правилом fastcgi ﹣ split ﹣ path ﹣ информационный метод. Один из них/собрание/публичное/index.php, которому присвоено имя $fastcgi ﹣ скрипта, а AAA/BBB/CCC-информация о пути $fastcgi. Затем назначьте $fastcgi ﹣ script ﹣ name имени файла сценария через fastcgi ﹣ param и передайте его на PHP-сервер. То же самое верно и для $fastcgi & пути и информации. Обратите внимание, что script ‘ filename и path’info здесь являются ключевыми именами супер глобальных переменных сервера $’и не могут быть написаны неправильно. Благодаря этому методу наш второй блок определения местоположения также обладает способностью pathinfo и устраняет недостатки первого метода.

Оригинал: “https://developpaper.com/nginx-sets-the-pathinfo-function-and-adapts-to-the-routing-mode-of-thinkp5/”