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?

15
demandé sur Rodrigo Souza 2016-04-04 16:37:14

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.

0
répondu morphatic 2016-04-08 01:53:17

pas tout à fait sûr de la solution, mais je pense que vous devriez essayer ceux-ci:

  • tout D'abord: définir le url correctement config/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.

0
répondu henriale 2016-04-11 00:42:23

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.

0
répondu Pietro 2016-04-14 15:59:28

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}

  1. Téléchargez le reste du projet laravel en dehors du répertoire racine public et donnez accès en écriture au dossier.

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

0
répondu Ashutosh Barthwal 2016-04-14 19:51:12

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.

0
répondu Martin Joiner 2017-08-29 10:58:10

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;
    }
}
0
répondu Arash Hatami 2017-09-16 21:20:31

Récemment, j'ai eu exactement le même problème. Je voulais avoir

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. ; -)

0
répondu Henno 2017-10-14 17:52:06

vous pouvez utiliser le paquet Laravel pour cela Laravel multi-locataire

0
répondu Pankaj Kachhwaye 2018-08-20 08:35:25