【问题标题】:Laravel project next to Wordpress project (in public_html folder)Laravel 项目旁边的 Wordpress 项目(在 public_html 文件夹中)
【发布时间】:2016-12-07 13:56:31
【问题描述】:

我的 public_html 文件夹中有一个 Laravel 项目。域例如 domain.com 我的 .htaccess 文件(在 public_html 文件夹中)是这样的:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

有以下路线:

  • api/牌照
  • api/日历
  • 授权/登录
  • 管理员/设置
  • 管理员/约会
  • 约会
  • ...

所以一个 URL 的例子是 http://domain.com/appointment

现在我想在 domain.com 上建立一个 wordpress 网站。因此,当您访问 domain.com 时,您会看到 wordpress 网站。但我也想要我的 laravel 项目的 /appointment 之类的网址。

最简单、最干净的方法是什么?

【问题讨论】:

  • 你想把wordpress安装在public_html目录还是public_html里面的子目录,例如public_html/wordpress?

标签: php wordpress .htaccess laravel http


【解决方案1】:

您可以在 Laravel 文件夹中创建指向 Wordpress 公共目录的符号链接。例如wp:

/var
     /www
         /laravel
             /public
                 /wp #(symlink to -> /var/www/wordpress/public_html)
                 index.php
                 .htaccess
         /wordpress
             /public_html
                 index.php
                 .htaccess

并在 .htaccess 中描述 Laravel 路由。 /var/www/laravel/public/.htaccess的代码示例:

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

    RewriteEngine On

    RewriteCond %{ENV:REDIRECT_FINISH} .
    RewriteRule ^ - [L]

    # Laravel

    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteCond %{REQUEST_FILENAME} !.*\.php$
    RewriteRule ^(.*)$ $1 [E=FINISH:1,L]

    RewriteCond %{REQUEST_URI} ^/(api/licenseplate)(\?.*|$) [OR]
    RewriteCond %{REQUEST_URI} ^/(api/calendar)(\?.*|$) [OR]
    RewriteCond %{REQUEST_URI} ^/(admin/settings)(\?.*|$) [OR]
    RewriteCond %{REQUEST_URI} ^/(admin/appointments)(\?.*|$) [OR]
    RewriteCond %{REQUEST_URI} ^/(appointment)(\?.*|$) [OR]
    RewriteCond %{REQUEST_URI} ^/(auth/login)(\?.*|$)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [E=FINISH:1,L]

    # Wordpress

    RewriteCond %{REQUEST_URI} !^/wp
    RewriteRule ^(.*)$ /wp/$1 [E=FINISH:1,L]

</IfModule>

/var/www/wordpress/public_html/.htaccess 的代码(只是您的 wordpress .htaccess 的副本):

# BEGIN WordPress

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

# END WordPress

【讨论】:

  • 这个答案的假设比问题所暗示的要多,特别是用户对public_html 的父目录有很大的控制权。拥有/var/www/wordpress/public_html 也很奇怪,并且没有什么告诉 Apache 在/var/www/laravel/public/.htaccess 中查找对domain.com 的请求。
  • Qevo,Web 服务器必须查看 /var/www/laravel/public/。这是更安全的解决方案。在这种方法中,除了/var/www/laravel/public//var/www/wordpress/public_html/ 之外,用户什么都看不到。即使.htaccess文件会被误删。
  • 您是正确的,请求必须限制在public 文件夹中。我的意思是,您的回答假设 Apache 具有指向此文件夹的设置,这不是一个合理的假设。
  • 对符号链接解决方案投赞成票,除了 Symfony 项目之外,可以做同样的事情来放置一个 WP 站点,只需将 Laravel 公共文件夹的符号链接替换为 Symfony 的 web 站点。跨度>
  • @mnv 如果您有 1 个本地环境和 1 个生产服务器需要处理,它将有所帮助。当您需要在多个测试服务器上部署解决方案、保留产品部署版本等时,它变得复杂。我总是试图避免使用符号链接,我觉得这是一个很好的做法。将不同的域逻辑分开总是更好。我建议使用真实目录而不是符号链接。当然,很大程度上取决于项目的规模和系统的复杂性。
【解决方案2】:

服务器结构

.htaccess 文件提供了一种基于每个目录进行配置更改的方法。这意味着您只需将请求定向到具有如何最好地处理请求的规则的目录。因此,您将把 Laravel 和 WordPress 附带的 .htaccess 文件留在它们的目录中。只需为包含它们的父目录创建另一个。

以下假设public_html的完整路径为/var/www/public_html

文件夹结构

/var/www/public_html/laravel
/var/www/public_html/wp

/var/www/public_html/.htaccess

# Limit Access To Laravel Public Folder
<Directory "/var/www/public_html/laravel">
    Order Deny,allow
    Deny from all
</Directory>

<Directory "/var/www/public_html/laravel/public">
    Allow from all
</Directory>

# Rewrite Requests
<IfModule mod_rewrite.c>

    RewriteEngine On

    # Do Not Rewrite Directory And File Requests
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.*)$ $1 [L]

    # Rewrite Laravel Routes
    RewriteCond %{REQUEST_URI} api/licenseplate [OR]
    RewriteCond %{REQUEST_URI} api/calendar [OR]
    RewriteCond %{REQUEST_URI} admin/settings [OR]
    RewriteCond %{REQUEST_URI} admin/appointments [OR]
    RewriteCond %{REQUEST_URI} appointment [OR]
    RewriteCond %{REQUEST_URI} auth/login
    RewriteRule ^(.*)$ laravel/public/$1 [L]

    # Rewrite To WordPress For Everything Else
    RewriteRule ^(.*)$ wp/$1 [L]

</IfModule>

应用程序设置

Laravel 和 WordPress 都可以生成指向其资产(图像、CSS、JavaScript)的链接。

WordPress 可轻松安装到子目录,因此您只需更改 General Settings Screen 上的 WordPress 地址和站点地址。

Laravel 假设它被安装到顶层目录。 asset() helper 用于生成资产文件的路径。所以你需要用你自己的一个来覆盖默认函数。方法如下:

用这些内容创建app/helpers.php

/**
 * Generate an asset path for the application
 * with the installation sub-directory 
 * prepended to the path.
 *
 * @param  string  $path
 * @param  bool    $secure
 * @return string
 */
function asset($path, $secure = null)
{
    $path = ltrim($path, '/');
    $dir = basename(dirname(__DIR__)) . '/public';
    $url = app('url')->asset($path, $secure);
    return str_replace($path, $dir . '/' . $path, $url);
}

通过编辑composer.jsonapp/helpers.php添加到自动加载过程中

"autoload": {    
    //...
    "files": [
        "app/helpers.php"
    ]
},

如果您有命令行访问权限,请更新 PHP composer

composer dump-autoload

【讨论】:

    【解决方案3】:

    这是我遇到类似情况时采取的一种方法。将wordpress 安装在public_html 目录中,最好将laravel application 放在WP 目录中:

    wp-admin/  
    wp-content/  
    wp-includes/  
    ... other wordpress files ...
    app/ <-- laravel application  
         |-> app/
         |-> bootstrap/
         |-> config/
         |-> public/
         |-> ... other laravel files and directories ...
    

    现在要在您的Laravel application 中获取WordPress functions,请在您的Laravel 安装中包含wp-load.php 然后您可以使用 enqueueing functionsWordPress 到 加载您需要的资源。

    最好的方法是遵循 Laravel 服务提供者架构。编写一个包含wp-load.php 的服务提供者并使用boot function 加载资产:

    // app/Providers/WordPressServiceProvider.php
    
    class WordPressServiceProvider extends ServiceProvider {
    
        protected $bootstrapFilePath = '../../wp-load.php'; // Adjust ur path
    
        public function boot() {
            // Load assets
            wp_enqueue_style('app', '/app/public/app.css'); // Adjust ur path
        }
    
        public function register() {
            // Load wordpress bootstrap file
            if(File::exists($this->bootstrapFilePath)) {
                require_once $this->bootstrapFilePath;
            } else throw new \RuntimeException('WordPress Bootstrap file not found!');
        }
    
    }
    

    并将服务提供者添加到您的 laravel 应用配置中,config/app.php:

     /* ... */
       'providers' => [
            // ...
    
            /*
             * Application Service Providers...
             */
            // ...
            App\Providers\WordPressServiceProvider::class,
    

    现在我们可以访问 Laravel 中的 WordPress 函数,并且可以将 laravel views 更改为:

    {!! get_header() !!}
            <div class="container">
                <div class="content">
                    <div class="title">Laravel 5</div>
                    <div class="quote">{{ Inspiring::quote() }}</div>
                </div>
            </div>
    {!! get_footer() !!}
    

    您的 wordpress 网站应该可以通过 www.urdomain.com 和 url www.urdomain.com/app/appointment 下的 laravel 应用程序访问,或者如果您希望使用不同的 URL 模式,请调整您的 .htaccess。希望对您有所帮助。

    【讨论】:

    • 这很有趣,但很可能 WordPress 和 Laravel 开发有不同的用户群。尽管如此,在两个应用程序之间建立前端一致性的一种有趣方式。
    • @Qevo,由于大部分 WP 功能现在都可以在 Laravel 应用程序中使用,我们可以轻松调整用户身份验证和管理的行为以使用相同的用户群。如果你看到了,事实上在接受答案的情况下会更困难。
    • 澄清一下,我指的是开发 Laravel 或 WordPress 的不同用户。你提出了一个很好的观点,我没有考虑应用程序之间的身份验证。我只能假设此时不需要。
    • 我明白了,但我相信两个框架的真正集成是两个框架可以无缝交互,而不会向最终用户暴露任何东西。否则,我认为不需要任何此类麻烦。只需设置符号链接或少量重定向即可。
    • 我认为 OP 并不关心前端和用户体验的一致性:{
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多