Подавать приложение Laravel из блока nginx / location (виртуальный хост) - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь обслуживать laravel из блока / location в конфигурации виртуального хоста Ubuntu nginx.У меня приложение laravel установлено и работает нормально при прямом доступе, но кажется, что блок местоположения nginx не делает того, что от него ожидается.

Это работает: https://www.madol.example.com/horizontal-laravel/public/index.php

Это не так(403): https://www.madol.example.com/horizontal-laravel/

Примечание: реальный адрес опущен.

Основные фрагменты, которые могут быть неправильными:

root /var/www/madol.example.com;
server_name madol.example.com www.madol.example.com;
location /horizontal-laravel {
    try_files $uri $uri/ /horizontal-laravel/public/index.php;
}

Вот полный код из моего файла конфигурации-

server {

     root /var/www/madol.example.com;
     index index.php index.html;

     server_name madol.example.com www.madol.example.com;

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

     location ~ \.php$ {
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
            include snippets/fastcgi-php.conf;
     }

     **# Something wrong here?**
     location /horizontal-laravel {
           try_files $uri $uri/ /horizontal-laravel/public/index.php;
     }

     location ~*  \.(jpg|jpeg|png|gif|svg|ico|css|js)$ {
            expires 7d;
}

     listen [::]:443 ssl; # managed by Certbot
     listen 443 ssl; # managed by Certbot
     ssl_certificate /etc/letsencrypt/live/madol.madcoderz.com/fullchain.pem; # managed by Certbot
     ssl_certificate_key /etc/letsencrypt/live/madol.madcoderz.com/privkey.pem; # managed by Certbot
     include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
     if ($host = www.madol.example.com) {
            return 301 https://$host$request_uri;
     } # managed by Certbot

     if ($host = madol.example.com) {
            return 301 https://$host$request_uri;
     } # managed by Certbot


     listen 80;
     listen [::]:80;
     server_name madol.example.com www.madol.example.com;
     return 404;
} # managed by Certbot

Есть ли какие-либо другие проблемы конфигурации помимо этого в коде?

1 Ответ

0 голосов
/ 17 февраля 2019

Директива index ищет файл в /var/www/madol.example.com/horizontal-laravel/index.php и ничего не находит.

Самое простое решение - расширить директиву index, чтобы искать index.php в пределах publicпапка.Подробнее см. в этом документе .

Например:

location /horizontal-laravel {
    index index.php public/index.php index.html;
    ...
}

Кроме того, вы можете остановить обработку индекса для этого location, удалив $uri/ термин файла из директивы try_files.Подробнее см. в этом документе .

Например:

location /horizontal-laravel {
    try_files $uri /horizontal-laravel/public/index.php;
    ...
}

Вы можете явно перенаправить этот URI с помощью оператора rewrite...last.Подробнее см. в этом документе .

location = /horizontal-laravel/ { 
    rewrite ^ /horizontal-laravel/public/index.php last; 
}
location /horizontal-laravel {
    ...
}

Наконец, вы можете изменить схему URI, чтобы исключить возможность показа бита /public/.Это, вероятно, лучше всего достигается с помощью директивы alias.Вам понадобится вложенное расположение для выполнения сценариев PHP под новым корнем.

Например:

location ^~ /horizontal-laravel {
    alias /var/www/madol.example.com/horizontal-laravel/public;
    if (!-e $request_filename) { rewrite ^ /horizontal-laravel/public/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        include snippets/fastcgi-php.conf;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

Обратите внимание, что директивы if и SCRIPT_FILENAME используют $request_filename дляполучить путь к локальному файлу.Вам нужно проверить, что находится внутри snippets/fastcgi-php.conf, чтобы убедиться, что оно ничего не сломало.

Использование try_files с alias проблематично из-за этой проблемы .См. это предупреждение об использовании if.

...