Installer plusieurs projets laravel dans des sous-dossiers sans sous-domaine
j'ai déjà essayé de chercher ce numéro, mais il est tout différent du mien, donc je poste ceci ici. J'essaie de créer un serveur web en utilisant nginx
pour accueillir plusieurs projets laravel dans des sous-dossiers. C'est mon labs le serveur. Donc j'aimerais avoir mes projets comme ceci:
- domain.com/project1
- domain.com/project2
- domain.com/project3
je suis la copie la suite de nginx location
bloc pour chaque projet (je ne sais pas ce qui se passe ici, j'ai juste copié à partir de l'internet et cela a fonctionné):
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?/ last;
}
et des routes reposantes dans mon application laravel comme celle-ci:
/*
|--------------------------------------------------------------------------
| 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', 'AuthAuthController@getLogin');
Route::post('auth/login', 'AuthAuthController@authenticate');
Route::get('auth/logout', 'AuthAuthController@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');
});
});
bien que cela semble fonctionner (la page apparaît, etc) quand il va dans la logique de business (save to database, etc. il apparaît à beaucoup de bugs. Par exemple quand j'essaie de créer un nouvel employé dans url http://domain.com/project1/administracao/funcionarios
il me donne l'erreur: SQLSTATE[42S22]: Column not found: 1054 Unknown column '/administracao/funcionarios' in
(c'est un peu ajoutant une url routes)
Et quand j'installe un sous-domaine comme project1.domain.com
tout fonctionne bien. Mais je ne veux pas créer un sous-domaine pour chaque projet, je veux qu'il fonctionne dans les url des sous-dossiers. Est-il possible?
8 réponses
je pense que le problème pourrait être dans votre nginx.conf
fichier. Essayez ceci:
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?/ last;
}
Aussi, assurez-vous que /home/web/project1/
est en dehors de votre racine web.
ceci étant dit, il n'est vraiment pas recommandé D'exécuter Laravel dans un sous-dossier. Beaucoup plus facile dans un sous-domaine.
j'ai eu l'idée de base pour cette suggestion de ce gist.
pas tout à fait sûr de la solution, mais je pense que vous devriez essayer ceux-ci:
- tout D'abord: définir le
url
correctementconfig/app.php
fichier. - Deuxièmement: l'examen de
public/web.config
fichier. Le problème pourrait être que ces configurations écrasent votre nginx. envisager de changer<action type="Rewrite" url="project1/index.php" />
et voir de quoi il en retourne.
Dans le dernier exemple, var_dump
le modèle et chercher d'où il vient.
avez-vous essayé cette configuration ?
https://gist.github.com/tsolar/8d45ed05bcff8eb75404
je testerai demain dès que j'aurai le temps de répliquer votre situation dans mon env.
il y a une solution simple pour " je veux qu'il fonctionne dans l'url des sous-dossiers. Est-il possible?".
les Étapes
1. créer un dossier à l'intérieur du dossier public de votre domaine principal.
vous devez créer 3 dossiers
accueil/web/public / project1
home/web/public/projet2
home/web/public / project3
2. A l'intérieur de chaque dossier de projet vous devez coller le contenu du dossier public de votre laravel app
(à partir de votre Laravel Projet) projet1/public/{contenu} -- copiez ceci à -->(serveur hébergé) maison/web/public/projet1/{contenu}
Téléchargez le reste du projet laravel en dehors du répertoire racine public et donnez accès en écriture au dossier.
Maintenant ouvert (serveur hébergé) public/projet1/index.php mettre à jour ces deux les champs
require _ _ DIR __."/ ../../ PROJECTONE/bootstrap / autoload.php';
$app = require_once _ _ DIR__."/ ../../ PROJECTONE/bootstrap / app.php';
J'ai réussi à exécuter un projet Laravel 5.4 dans un "sous-dossier" d'un autre site en utilisant un simple lien symbolique.
il n'y avait pas de règles spéciales de réécriture funky dans la configuration de Nginx. Pas de copier-coller des articles du projet. Aucune mention du sous-dossier dans le parcours. Juste un projet Laravel 5 normal parfaitement contenu quelque part sur le serveur et un lien symbolique vers son dossier public à partir de la racine du document du site principal.
/var/www/domain.com/public/project1 --> /var/www/project1/public
toutes les routes fonctionnent!
en écrivant vos vues vous devez envelopper les chemins pour les actifs côté client dans asset()
fonction helper pour que les chemins dans le HTML contiennent le sous-dossier et le navigateur peut les trouver.
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
mais faire cela ne rend pas votre code moins flexible, parce que si vous exécutez le site dans un environnement où il n'est pas accédé via un sous-dossier, il fonctionne parce que asset()
fonctionne avec ce que la barre d'adresse contient.
essayez quelque chose comme ça .... Je suis en suivant le .conf
pour mon serveur :
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/public/ break;
}
location /project1{
rewrite ^/project1/(.*)$ /project1/public/index.php? last;
}
location /project2 {
rewrite ^/project2/(.*)$ /project2/public/index.php? 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 ;
}
fastcgi_param REQUEST_URI $laravel_uri;
fastcgi_param LARA_ENV local; # Environment variable for Laravel
fastcgi_param HTTPS off;
}
location ~ /\.ht {
deny all;
}
}
Récemment, j'ai eu exactement le même problème. Je voulais avoir
- http://customerdemo.example.com/project1/
- http://customerdemo.example.com/project2/
- http://customerdemo.example.com/project3/
mais je détestais devoir modifier nginx conf à chaque fois que j'ajoutais un nouveau projet.
Voici ce que j'ai trouvé:
# 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 /;
# 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;
}
}
le résultat est que je ne avoir à faire autre CHOSE que git clone
in /sites/customerdemo.exemple.com / folder et exécuter composer install
et php artisan migrate
ajouter un nouveau projet.
en fait, j'ai développé moi-même un panneau de contrôle où je peux cliquer sur "Ajouter projet" et spécifier les détails du projet et un nouveau Bitbucket repo, mysql utilisateur et base de données sera créé et customerdemo serveur sera donné déployer l'accès à ce bitbucket repo et un webhook est mis en place dans ce nouveau repo qui appellera un script de déploiement sur customerdemo serveur à chaque fois que quelqu'un s'engage à maîtriser sur ce repo qui déclenchera soit git clone ou git pull et composer install et la migration de base de données. C'est pourquoi j'avais besoin de la configuration dynamique de Nginx. ; -)
vous pouvez utiliser le paquet Laravel pour cela Laravel multi-locataire