【问题标题】:How to Handle Routes of Two Laravel Projects on One Domain or Server?如何在一个域或服务器上处理两个 Laravel 项目的路由?
【发布时间】:2015-12-18 13:19:21
【问题描述】:

我正在开展一个项目,该项目分为两个独立的部分。第一部分,更大的部分,在 Laravel 4.2 中。第二部分,较短的部分,在 Laravel 5 中。两者都在同一个服务器上。

我的目标是访问和使用两个项目的路由,即项目 1 可以调用和访问项目 2 的路由,反之亦然。

为了访问这两个项目,我正在做的是使用以下虚拟主机文件:

<VirtualHost *:80>
    ServerAdmin m.khuramj@live.com
    DocumentRoot /var/www/Laravel4Project/public

    ServerName www.Laravel4Project.dev
    Alias /billing /var/www/Laravel5Project/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/Laravel4Project/public/>
        AllowOverride All
    </Directory>
</VirtualHost>

上面文件中的 '/billing' 别名允许我在 Laravel4Project 中访问 Laravel5Project,而无需在我的 Laravel4Project 的 'routes.php' 文件中声明 '/billing' 路由。会话和身份验证很好。到这里没问题。

问题是“计费”别名指向 Laravel5Project 中的“/”根目录,而我的 Laravel5Project 中还有一些其他路由,如下所示:

Route::get('/', function() {
    return 'Laravel 5 Project';
}

Route::get('/anOtherRoute', function() {
    return 'Another Route from Laravel 5 Project';
}

要访问 Laravel5Project 的 '/' 路由,我在我的 Laravel4Project 中提供了 '/billing' 链接,它工作正常,让我可以访问 Laravel5Project。但是当我在 Laravel4Project 中提供 '/billing/anotherRoute' 或 '/anotherRoute' 链接时访问 Laravel5Project 的 '/anotherRoute' 都不起作用并且 Apache 服务器给我以下错误:

Not Found
    The requested URL /billing/anotherRoute was not found on this server.
    Apache/2.4.12 (Ubuntu) Server at www.laravel4project.dev Port 80

我知道这是因为在我的 Laravel4Project 中没有路由 '/billing/antohterRoute/' 但它在 Laravel5Project 的 'route.php' 文件中。 '/billing' 本身不是路由,它只是一个 'Alis'。

所以我的问题是如何从 Laravel4Project 中访问 Laravel5Project 的所有路由,反之亦然?

以下是 Laravel4Project 和 Laravel5Project 的 .htaccess 文件:

Laravel4Project 根目录中的.htaccess 文件:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond  %{REQUEST_URI}  !^/mm.*$
    RewriteRule ^(.*)$ public/$1 [L,QSA]

    RewriteCond  %{REQUEST_URI}  ^/mm.*$
    RewriteRule ^/mm/(.*)$ public/mm/$1 [L,QSA]
</IfModule>
AddDefaultCharset utf-8

Laravel4Project 'public' 目录中的.htaccess 文件:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Laravel5Project公共目录中的.htaccess文件:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

编辑

我已经发布了我找到的答案。只需提供下面给出的 URL 即可解决问题。

www.laravel4project.dev/billing/index.php/anotherRoute

另一个问题:

现在剩下的唯一问题是摆脱并从 URL 中删除“index.php”。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: php apache .htaccess mod-rewrite laravel-routing


    【解决方案1】:

    在等待 Laravel 社区和堆栈交换的回复后,我无法得到答案。

    但我也不断尝试自己寻找解决方案,这里是:

    如果您在上面的问题中注意到我提到 Apache 给了我以下错误:

    Not Found
    The requested URL /billing/anotherRoute was not found on this server.
    Apache/2.4.12 (Ubuntu) Server at www.laravel4project.dev Port 80
    

    注意 URL “/billing/anotherRoute” 和域 “www.laravel4Project.dev”。这意味着我给出的 URL 是错误的,如下所示:

    网址错误

    www.laravel4project.dev/billing/anotherRoute
    

    只需在“/billing”后添加“index.php”即可。所以正确的 URL 如下所示:

    正确的网址

    www.laravel4project.dev/billing/index.php/anotherRoute
    

    现在剩下的唯一问题是摆脱并从 URL 中删除“index.php”。

    有人可以帮我解决这个问题吗?

    【讨论】:

      【解决方案2】:

      这正是我多年来所面临的问题,最后,我想出了如何解决它们。
      您只需要修改 .htaccess 文件和一些小改动。
      假设我有两个项目:project1 和 project2。两个项目的结构(在/var/www):

      project1/__app/
          |__bootstrap/
          |__public/
                  |__blog/ (include css, js,...)
                  |__.htaccess
                   ...
      ...
      project2/__app/
          |__bootstrap/
          |__public/
                   |__shop/ (include css, js,...)
                   |__.htacess
                    ...
      ...
      

      首先,复制project1中public文件夹的所有内容,然后放入project2的public文件夹中。在 project1 的 public 文件夹中创建名为 blog2 的新文件夹,并将 project1 的 public 文件夹中的所有内容移动到文件夹 blog2 中。会是这样的:

      project1/__app/
              |__bootstrap/
              |__public/
                      |__blog2/
                              |__blog/ (include css, js, ...)
                              |__.htaccess
                              ...
                      |__shop/ (include css, js, ...)
                      |__.htacess
                      ...
      ....
      

      接下来,编辑 .htaccess: project1/../public/blog2/.htacess:

      <IfModule mod_rewrite.c>
      <IfModule mod_negotiation.c>
          Options -MultiViews
      </IfModule>
      
      RewriteEngine On
      
      # Redirect Trailing Slashes If Not A Folder...
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)/$ /$1 [L,R=301]
      
      # Handle Front Controller...
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^ /blog2/index.php [L]
      

      文件 project1/../public/shop/.htaccess:

      <IfModule mod_rewrite.c>
      <IfModule mod_negotiation.c>
          Options -MultiViews
      </IfModule>
      
      RewriteEngine On
      
      # Base Rewrite Path...
      RewriteBase /
      
      # Redirect Trailing Slashes...
      RewriteRule ^(.*)/$ /$1 [L,R=301]
      
      # Handle Front Controller...
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      
      RewriteRule ^ /shop/index.php [L]
      

      创建一个新的 .htaccess 并放置在 project1 的 public 文件夹中:

      <IfModule mod_rewrite.c>
      <IfModule mod_negotiation.c>
          Options -MultiViews
      </IfModule>
      
      RewriteEngine On
      
      # Redirect Trailing Slashes If Not A Folder...
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(!shop*) /blog2/$1 [L,R=301]
      
      # Handle Front Controller...
      RewriteCond %{REQUEST_URI} !shop
      RewriteRule ^(.*)$ /blog2/$1 [L]
      

      最后修改文件project1/../public/shop/index.php:
      之前:

      require __DIR__.'/../bootstrap/autoload.php';
      $app = require_once __DIR__.'/../bootstrap/app.php';
      

      之后:

      require __DIR__.'/../../../project2/bootstrap/autoload.php';
      $app = require_once __DIR__.'/../../../project2/bootstrap/app.php';
      

      所以我不需要虚拟主机文件中的“别名”行。希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-20
        • 2011-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多