Как перенаправить пути подпапок URL-адресов запросов к определенным страницам php с помощью nginx и php-fpm

Я впервые использую локальный сервер nginx для настройки веб-сайта, который я создаю, и у меня возникают проблемы с настройкой конфигурации nginx для обработки запросов URL-адресов так, как я хочу. Мой веб-сайт обслуживает несколько php-страниц, когда пользователь перемещается по веб-сайту. При разработке сайта изначально с использованием локального php-сервера я использовал GET-запросы с изменениями window.location.href для навигации по сайту. Например:

http://localhost:8000/shop.php?filter=all&sort=id_asc&page=3

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

Структура моего сайта выглядит примерно так:

Веб-сайт:

->index.php  
->shop.php  
->about.php  
->product-page.php  
->/css/  
->/javascript/  
->/php/

Я хочу настроить nginx для маршрутизации URL-адресов следующим образом.

www.mywebsite.com -> routes to index.php  
www.mywebsite.com/shop -> routes to shop.php  
www.mywebsite.com/shop/anything -> routes to shop.php  
www.mywebsite.com/about -> routes to about.php  
www.mywebsite.com/product -> routes to product-page.php   
www.mywebsite.com/product/anything -> routes to product-page.php 

Я пробовал множество предложений за пару дней, прежде чем спросить здесь, но все потерпело неудачу по той или иной причине, 404, 500 внутренних ошибок и циклов перенаправления. Я надеюсь получить немного здесь, пока я перехожу к другим аспектам сайта, чтобы перестать биться головой о стену. Вот состояние моего nginx conf на данный момент:

server {
listen 80 ;
listen [::]:80 ;

server_name localhost;

root /var/www/html/reagansrockshop;
index index.php index.html;

location / {
    try_files $uri $uri/ =404;
}

location = /shop {
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index shop.php;
    try_files $uri /shop.php;
}

location /shop/ {
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    try_files $uri /shop.php;
}

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

}

Как я мог решить эту проблему? И если есть лучший стандарт в структурировании веб-сайта и его URL-адресов, пожалуйста, дайте мне знать. Это мой первый веб-сайт и первый раз, когда я использую nginx, поэтому я немного наивен в отношении лучших практик.


person Justin Bramel    schedule 23.01.2021    source источник


Ответы (1)


Если вам нужен определенный php-скрипт, отвечающий за весь путь, вам нужен такой конфиг:

root /var/www/html/reagansrockshop; # root directive is necessary to define where '/' is
location /shop/ { # this means "all URLs starting with '/shop/' "
  index /shop.php; # be careful with path to the file here
}

Хотя я бы скорее рекомендовал более традиционную и чистую структуру проекта.

В корне вашего проекта создайте две директории: shop и product. Переместите shop.php и product-page.php в указанную папку и переименуйте их в index.php. Ваша конфигурация nginx для этой структуры будет такой:

server {
listen 80 ;
listen [::]:80 ;

server_name localhost;

root /var/www/html/reagansrockshop;
index index.php index.html;

location / {
  index index.php;
  try_files $uri $uri/ =404;
}

location /shop/ {
  try_files $uri $uri/ /shop/index.php?$args;
}

location /product/ {
  try_files $uri $uri/ /product/index.php?$args;
}

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
person anemyte    schedule 25.01.2021
comment
Простое решение, которое работает. Это дало мне хорошую базу для старта. Очень признателен. - person Justin Bramel; 26.01.2021