【问题标题】:Wordpress with Laravel running on subfolder在子文件夹上运行 Laravel 的 Wordpress
【发布时间】:2017-10-14 12:54:29
【问题描述】:

我需要将新的 Laravel 应用添加到现有的 Wordpress 网站。两者都将通过 Apache 网络服务器运行。这个想法是:

  • https://website.com/ -> WordPress 网站
  • https://website.com/laravelapp -> Laravel 网络应用程序

在文件系统中,根文件夹包含 Wordpress 文件,子文件夹 laravelapp 包含 Laravel 文件(因此,laravel public 文件夹是 laravelapp 的子文件夹)。

当我浏览这些时,这是当前返回的结果:

  • https://website.com/ -> 返回 Wordpress 网站,并带有有效的永久链接
  • https://website.com/laravelapp -> 返回 403 错误
  • https://website.com/laravelapp/public -> 返回 Laravel 应用

这表明 mod_rewrite 可用并且可以正常工作。但我希望用户能够只使用 https://website.com/laravelapp 访问该 laravel 应用程序(而不是公用文件夹)。

我一直在尝试设置.htaccess 以使这种安排成为可能,但我遇到了困难。我目前有:

  • .htaccess 位于网站根目录

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} !^/laravelapp [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    
  • .htaccesslaravelapp 文件夹上

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /laravelapp/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ public/$1 [L]
    </IfModule>
    ```
    
  • laravelapp/public 文件夹上的.htaccess 包含来自分发包的标准 laravel .htaccess 文件。

有什么办法可以做到吗?

【问题讨论】:

  • 是否可以在子域上设置您的 laravel 应用程序?
  • 不幸的是子域不是一个选项:(

标签: wordpress apache laravel .htaccess


【解决方案1】:

Laravel 网站阅读有

RewriteBase /

所以我认为你需要为 Laravel 网站创建一个子域的最佳方式。

但您仍然可以尝试按照以下方式配置您的 .htaccess:

  1. 创建一个指向新位置的类

创建一个新文件 shared_hosting_root\applications\your_app_root\app\GoPublic.php

class GoPublic extends \Illuminate\Foundation\Application
{
    /**
    * Get the path to the public / web directory.
    *
    * @return string
    */
    public function publicPath()
    {
    return $this->basePath.DIRECTORY_SEPARATOR.'../../public_html/your_app_name';
    }
}

我们在这里使用相对路径,因此您不必知道绝对路径。但遵循我之前提到的相同推荐的文件夹结构非常重要。

您可能需要在根文件夹中运行以下命令来自动加载新类。否则你会得到一个错误,说找不到类。

composer dump-autoload
  1. 编辑 bootstrap\app.php

    /* -- remove/comment this original code
    $app = new Illuminate\Foundation\Application(
     realpath(__DIR__.'/../')
    );
    -- until here */
    
    /* -- add this new code -- */
    $app = new App\GoPublic(
     realpath(__DIR__.'/../')
    );
    
  2. 编辑 public\index.php

改变

require __DIR__.'/../bootstrap/autoload.php';

require __DIR__.'/../../applications/your_app_name/bootstrap/autoload.php';

改变

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

$app = require_once __DIR__.'/../../applications/your_app_name/bootstrap/app.php';
  1. 将 public 复制到 public_html

现在,复制applications\your_app_name\public into public_html\your_app_name中的内容。

为了简化这个过程,我会创建一个 bash 文件来自动将文件复制到新位置。

创建一个新文件shared_hosting_root\applications\your_app_name\deploy.sh

#!/bin/bash
echo "Copy public folder to public_html/your_app_name"
rsync -rv ./public/ ../../public_html/your_app_name

使用 rsync 可确保如果您多次运行此 deploy.sh,则只会将较新的内容复制到新位置。

当你准备好运行它时,在终端运行:

?> cd applications\your_app_name
?> sh deploy.sh

注意:必须在 applications\your_app_name 中运行 deploy.sh,否则会失败。

  1. 配置您的.htaccess

更改您的.htaccess 关注此

# Do not change this line. 
RewriteEngine on 

# Change example.com to your domain name
RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 

# Change your_app_name to the subfolder name
RewriteCond %{REQUEST_URI} !^/your_app_name/ 

# Don't change the following two lines. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# Change your_app_name to the subfolder name
# Change example.com to your domain name
RewriteRule ^(.*)$ /your_app_name/$1 
RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 
RewriteRule ^(/)?$ your_app_name/index.php [L]

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 2015-05-15
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多