Установка нескольких проектов 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}
-
Загрузите оставшуюся часть проекта laravel вне общедоступного корневого каталога и дайте возможность записи в папку.
-
Теперь откройте (размещенный сервер) 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.; -)
Ответ 8
Вы можете использовать пакет Laravel для этого мультитенанта Laravel
Ответ 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;
}}