Установка нескольких проектов laravel в подпапках без субдомена

Я уже пытался найти эту проблему, но все это отличается от моего, поэтому я размещаю это здесь. Я пытаюсь создать веб-сервер, используя nginx для размещения нескольких проектов larvel в подпапках. Это мой сервер labs. Поэтому я хотел бы, чтобы мои проекты были такими:

  • domain.com/project1
  • domain.com/project2
  • domain.com/project3

Я копирую следующий блок nginx location для каждого проекта (я не знаю, что здесь происходит, я просто скопировал из Интернета, и он работал):

location ^~ /project1/ {
        alias /home/web/project1/public;
        try_files $uri $uri/ @project1;

    location ~ \.php {
        fastcgi_pass                    unix:/var/run/php5-fpm.sock;
        fastcgi_index                   index.php;
        include                         /etc/nginx/fastcgi_params;
        fastcgi_param                   SCRIPT_FILENAME "/home/web/project1/public/index.php";
    }

}

location @project1 {
     rewrite /avm/(.*)$ /project1/index.php?/$1 last;
}

И RESTful маршруты в моем приложении laravel:   

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

Route::get('/', ['middleware' => 'auth','uses' => '[email protected]'])->name('home');

// Authentication
Route::get('auth/login', 'Auth\[email protected]');
Route::post('auth/login', 'Auth\[email protected]');
Route::get('auth/logout', 'Auth\[email protected]');

// Administração
Route::group(['prefix' => 'administracao', 'middleware' => 'auth'], function() {
    Route::resource('filiais', 'FiliaisController');
    Route::resource('precos', 'PrecosController');
    Route::resource('funcionarios', 'FuncionariosController');
    Route::resource('cargos', 'CargosController');
    Route::resource('vendedores', 'VendedoresController');
});

// Comercial
Route::group(['prefix' => 'comercial', 'middleware' => 'auth'], function() {
    Route::resource('clientes', 'ClientesController');
    Route::resource('fichas', 'FichasController');
});

// Operacional
Route::group(['prefix' => 'operacional', 'middleware' => 'auth'], function() {
    Route::resource('agenda', 'AgendaController');
    Route::resource('os', 'OsController');
    Route::resource('ambientes', 'AmbientesController');
    Route::resource('processos', 'ProcessosController');
    Route::get('relatorios', '[email protected]');

    Route::group(['prefix' => 'processo', 'middleware' => 'auth'], function() {
        Route::get('create', '[email protected]');
        Route::get('index', '[email protected]');

        Route::post('{os}/parse', '[email protected]');

        Route::get('{os}', '[email protected]');
        Route::match(['get', 'post'], '{os}/detalhe', '[email protected]');
        Route::get('{os}/duplicidades', '[email protected]');
        Route::get('{os}/restantes', '[email protected]');
        Route::match(['get', 'post'], '{os}/auditoria', '[email protected]');
        Route::match(['get', 'post'], '{os}/operadores', '[email protected]');
        Route::match(['get', 'post'], '{os}/divergencia', '[email protected]');
        Route::match(['get', 'post'], '{os}/finalizar', '[email protected]');
        Route::get('{os}/excluir/{setor}', '[email protected]');
    });
});

Хотя кажется, что он работает (страница появляется и т.д.), когда она переходит в логику бизнес-процессов (сохранение в базу данных и т.д.), похоже, у нее много ошибок. Например, когда я пытаюсь создать нового сотрудника в url http://domain.com/project1/administracao/funcionarios, он дает мне ошибку: SQLSTATE[42S22]: Column not found: 1054 Unknown column '/administracao/funcionarios' in (он вроде бы предваряет некоторые маршруты URL)

И когда я настраиваю субдомен, например project1.domain.com, все работает отлично. Но я не хочу создавать субдомен для каждого проекта, я хочу, чтобы он работал в url вложенных папок. Возможно ли это?

Ответ 1

Я думаю, проблема может быть в вашем файле nginx.conf. Попробуйте следующее:

location ^~ /project1 {
        alias /home/web/project1/public;
        try_files $uri $uri/ @project1;

    location ~ \.php {
        fastcgi_pass     unix:/var/run/php5-fpm.sock;
        fastcgi_index    index.php;
        include          /etc/nginx/fastcgi_params;
    }

}

location @project1 {
    rewrite /project1/(.*)$ /project1/index.php?/$1 last;
}

Кроме того, убедитесь, что /home/web/project1/ находится вне вашего веб-корня.

Это, как говорится, действительно не рекомендуется запускать Laravel в подпапке. Гораздо проще в поддомене.

Я получил основную идею этого предложения от этот смысл.

Ответ 2

Не совсем уверен в решении, но я думаю, вы должны попробовать следующие:

  • Во-первых: установка url в файле config/app.php.
  • Во-вторых: просмотр файла public/web.config. Проблема может заключаться в том, что эта конфигурация перезаписывает ваш nginx. рассмотрите возможность изменения <action type="Rewrite" url="project1/index.php" /> и посмотрите, что он возвращает.

В последнем случае var_dump модель и посмотрите, откуда она взялась.

Ответ 3

Вы пробовали эту конфигурацию?

https://gist.github.com/tsolar/8d45ed05bcff8eb75404

Я буду тестировать завтра, как только у меня будет время, чтобы воспроизвести вашу ситуацию в моем env.

Ответ 4

Существует простое решение: "Я хочу, чтобы он работал в url вложенных папок. Возможно ли это?".

Steps
 1. Сделайте папку внутри общей папки общего доступа.  вам нужно создать 3 папки
Главная/Интернет/открытый/project1
Главная/Интернет/открытый/project2
Главная/Интернет/открытый/project3

 2. Внутри каждой папки проекта вам нужно вставить содержимое общей папки вашего приложения laravel

(из вашего проекта Laravel) project1/public/{contents} - скопируйте это на → (размещенный сервер) home/web/public/project1/{contents}

  1. Загрузите оставшуюся часть проекта laravel вне общедоступного корневого каталога и дайте возможность записи в папку.

  2. Теперь откройте (размещенный сервер) public/project1/index.php обновить эти два поля

требуется __DIR __. '/../../PROJECTONE/bootstrap/autoload.php';

$app = require_once __DIR __. '/../../PROJECTONE/bootstrap/app.php';

Ответ 5

Я успешно выполнил проект Laravel 5.4 во "подпапке" другого сайта, используя простую символическую ссылку.

В конфигурации Nginx не было никаких особых правил перезаписи. Нет копии и вставки разделов проекта. Не упоминается вложенная папка на маршрутах. Просто регулярный проект Laravel 5, аккуратно содержащийся где-то на сервере, и символическую ссылку на него в общей папке из основного корня документа сайта.

/var/www/domain.com/public/project1 --> /var/www/project1/public

Все маршруты просто работают!

При написании своих представлений вам необходимо обернуть пути для ресурсов на стороне клиента в вспомогательной функции asset(), поэтому пути в HTML будут содержать подпапку, и браузер может их найти.

<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">

Но это не делает ваш код менее гибким, потому что если вы запустите сайт в среде, где он не доступен через подпапку, он работает, потому что asset() работает с тем, что содержит адресная строка.

Ответ 6

попробуйте что-то вроде этого.... Я использую следующий .conf для моего сервера:

server {
    listen  80;
    root /vagrant;
    index index.html index.htm index.php app.php app_dev.php;

    server_name 192.168.33.10.xip.io;

    access_log /var/log/nginx/vagrant.com-access.log;
    error_log  /var/log/nginx/vagrant.com-error.log error;

    charset utf-8;

    location ~project(\d*)/((.*)\.(?:css|cur|js|jpg|jpeg|gif|htc|ico|png|html|xml))$ {
        rewrite project(\d*)/((.*)\.(?:css|cur|js|jpg|jpeg|gif|htc|ico|png|html|xml))$ /project$1/public/$2 break;
    }

    location /project1{
         rewrite ^/project1/(.*)$ /project1/public/index.php?$1 last;
    }

     location /project2 {
        rewrite ^/project2/(.*)$ /project2/public/index.php?$1 last;
    }

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        set $laravel_uri $request_uri;
        if ($laravel_uri ~ project(\d*)(/?.*)$) {
            set $laravel_uri $2;
        }
        fastcgi_param REQUEST_URI $laravel_uri;
        fastcgi_param LARA_ENV local; # Environment variable for Laravel
        fastcgi_param HTTPS off;
    }
    location ~ /\.ht {
        deny all;
    }
}

Ответ 7

Недавно у меня была такая же проблема. Я хотел иметь

но я ненавидел необходимость изменять nginx conf каждый раз, когда добавлял новый проект.

Вот что я придумал:

# Capture $project from /$projectname/controller/action
map $request_uri $project {

    ~^/(?<captured_project>[a-zA-Z0-9_-]+)/? $captured_project;
    default / ;
}

server {

    listen 11.22.33.44:80;

    server_name customerdemo.example.com www.customerdemo.example.com;

    # Use $project/public as root
    root /sites/customerdemo.example.com/$project/public;

    # Use index.php as directory index
    index index.php;

    # Include the basic h5bp config set (see https://github.com/h5bp/server-configs-nginx)
    include h5bp/basic.conf;

    # Process /projectname/the/rest/of/the/url
    location ~ ^/([^/]+)/(.*) {

        # Save the rest of the URL after project name as $request_url
        set $request_url /$2;


        # If the saved url refers to a file in public folder (a static file), serve it,
        # else redirect to index.php, passing along any ?var=val URL parameters
        try_files $request_url /index.php?$is_args$args;

    }

    # Process any URL containing .php (we arrive here through previous location block)
    # If you don't need to serve any other PHP files besides index.php, use location /index.php here
    # instead, to prevent possible execution of user uploaded PHP code
    location ~ [^/]\.php(/|$) {

        # Define $fastcgi_script_name and $fastcgi_path_info
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;

        # Immediately return 404 when script file does not exist
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        # Mitigate https://httpoxy.org/ vulnerabilities
        fastcgi_param HTTP_PROXY "";

        # Define PHP backend location (find yours by grepping "listen ="
        # from your PHP config folder, e.g. grep -r "listen =" /etc/php/)
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;

        # Set SCRIPT_FILENAME to execute
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

        # Include the default fastcgi parameters
        include fastcgi_params;

        # Overwrite REQUEST_URI (default is $request_uri) with $request_url we saved earlier
        fastcgi_param  REQUEST_URI        $request_url;
    }

}

В результате я не должен делать ничего, кроме git clone в папке/sites/customerdemo.example.com/и запускать composer install и php artisan migrate, чтобы добавить новый проект.

На самом деле, я разработал панель управления, на которой я могу нажать "Добавить проект" и указать детали проекта, а также создать новый битбокс-репо, пользователь и база данных mysql, и сервер customerdemo получит возможность развертывания для этого репозитория битбакет и в этом новом репо создается webhook, который будет вызывать развертывание script на сервере customerdemo каждый раз, когда кто-то совершает мастерство в этом репо, которое инициирует либо клонирование git, либо git pull and composer install and database migration. Вот почему мне нужна динамическая конфигурация Nginx.; -)

Ответ 9

Проверьте эту конфигурацию Nginx, я думаю, это поможет вам

'server {имя_сервера main-app.dev; root/var/www/projects/main/public;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

index index.html index.htm index.php;
charset utf-8;
# sub_directory
location ^~ /sub-app {
  alias /var/www/projects/sub/public;
  try_files $uri $uri/ @sub;

    location ~ \.php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_read_timeout 30000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/projects/sub/public/index.php;
    }
    access_log off;
    error_log  /var/www/projects/sub/storage/log/error.log error;
}

location @sub {
   rewrite /sub/(.*)$ /sub/index.php?/$1 last;
} # end sub_directory

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

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

access_log off;
error_log  /var/www/projects/main/storage/log/error.log error;

error_page 404 /index.php;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_read_timeout 30000;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
}

location ~ /\.(?!well-known).* {
    deny all;
}}