在没有子域的子文件夹中安装多个laravel项目

我已经尝试过search这个问题,但是和我的都不一样,所以我在这里发布。 我试图创build一个使用nginx在子文件夹中托pipe多个laravel项目的networking服务器。 这是我的实验室服务器。 所以我想要我的项目是这样的:

  • 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; } 

和我的laravel应用程序中的RESTful路线是这样的:

 /* |-------------------------------------------------------------------------- | Application Routes |-------------------------------------------------------------------------- | | Here is where you can register all of the routes for an application. | It's 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' => 'HomeController@index'])->name('home'); // Authentication Route::get('auth/login', 'Auth\AuthController@getLogin'); Route::post('auth/login', 'Auth\AuthController@authenticate'); Route::get('auth/logout', 'Auth\AuthController@getLogout'); // 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', 'RelatoriosController@index'); Route::group(['prefix' => 'processo', 'middleware' => 'auth'], function() { Route::get('create', 'ProcessoController@create'); Route::get('index', 'ProcessoController@index'); Route::post('{os}/parse', 'ProcessoController@parse'); Route::get('{os}', 'ProcessoController@principal'); Route::match(['get', 'post'], '{os}/detalhe', 'ProcessoController@detalhe'); Route::get('{os}/duplicidades', 'ProcessoController@duplicidades'); Route::get('{os}/restantes', 'ProcessoController@restantes'); Route::match(['get', 'post'], '{os}/auditoria', 'ProcessoController@auditoria'); Route::match(['get', 'post'], '{os}/operadores', 'ProcessoController@operadores'); Route::match(['get', 'post'], '{os}/divergencia', 'ProcessoController@divergencia'); Route::match(['get', 'post'], '{os}/finalizar', 'ProcessoController@finalizar'); Route::get('{os}/excluir/{setor}', 'ProcessoController@destroy'); }); }); 

虽然它似乎工作(页面出现等),当它进入商业逻辑(保存到数据库等),它似乎有很多的错误。 例如,当我尝试在url中创build一个新员工http://domain.com/project1/administracao/funcionarios它给了我错误: SQLSTATE[42S22]: Column not found: 1054 Unknown column '/administracao/funcionarios' in (这是有点前置一些url路线)

而当我设置像project1.domain.com的子域一切工作正常。 但是我不想为每个项目创build一个子域,我希望它在子文件夹的url中工作。 可能吗?

我认为这个问题可能在你的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/位于Web根目录之外。

这就是说,真的不建议在子文件夹中运行Laravel。 在一个子域中更容易。

我从这个要点中得到了这个建议的基本思路。

不完全确定的解决方案,但我认为你应该尝试这些:

  • 首先:在config/app.php文件中正确设置url
  • 其次:审查public/web.config文件。 问题可能是这些配置覆盖你的nginx。 考虑改变<action type="Rewrite" url="project1/index.php" />并且看看它返回的结果。

在最后一个例子中, var_dump模型并查找它来自哪里。

你有没有试过这种配置?

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

我会尽快在明天进行测试,以便在我的环境中复制您的情况。

有一个简单的解决方案,“我希望它在子文件夹url中工作,这有可能吗?”。

脚步
1.使您的主域公用文件夹内的文件夹。 你需要创建3个文件夹
家用/网络/公共/ PROJECT1
家用/网络/公共/项目2
家用/网络/公共/项目3

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';

我已经使用一个简单的符号链接成功地在另一个站点的“子文件夹”中运行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()和地址栏一起工作。

尝试这样的东西….我为我的服务器使用以下的.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; } } 

最近我有完全相同的问题。 我想要

但我讨厌每次添加新项目时都要修改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, eg 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; } } 

结果是我不需要在/sites/customerdemo.example.com/文件夹下做任何其他的git clone ,运行composer installphp artisan migrate来添加一个新的项目。

实际上,我自己开发了一个控制面板,在这里我可以点击“添加项目”,指定项目细节和一个新的bitbucket仓库,mysql用户和数据库将被创建,customerdemo服务器将被部署访问这个bitbucket仓库和webhook被设置在这个新的回购,这将调用一个部署脚本customerdemo服务器每次有人提交掌握这个回购,这将触发git克隆或git拉和作曲家安装和数据库迁移。 这就是为什么我需要动态的Nginx配置。 😉