Php Wordpress项目旁边的Laravel项目(在公共html文件夹中)

Php Wordpress项目旁边的Laravel项目(在公共html文件夹中),php,wordpress,.htaccess,laravel,http,Php,Wordpress,.htaccess,Laravel,Http,我的public\u html文件夹中有一个Laravel项目。例如,域是domain.comMy.htaccess文件(位于public\u html文件夹中),如下所示: <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule> 重新启动发动机 重写规则^(.*)$public/$1[L] 有以下路线: 空气污染指数/牌照 ap

我的public\u html文件夹中有一个Laravel项目。例如,域是domain.comMy.htaccess文件(位于public\u html文件夹中),如下所示:

<IfModule mod_rewrite.c>
    RewriteEngine On

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

重新启动发动机
重写规则^(.*)$public/$1[L]
有以下路线:

  • 空气污染指数/牌照
  • api/日历
  • 身份验证/登录
  • 管理员/设置
  • 行政/预约
  • 任命
因此,URL的一个示例是

现在我想在domain.com上建立一个wordpress网站。因此,当你访问domain.com时,你会看到wordpress网站。但我也希望有像我的laravel项目的URL/约会


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

您可以在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>
服务器结构
.htaccess
文件提供了一种按目录进行配置更改的方法。这意味着您只需要将请求定向到具有最佳处理请求规则的目录。因此,您将把Laravel和WordPress附带的
.htaccess
文件留在它们的目录中。只需为包含它们的父目录创建另一个

下面假设
public\u html
的完整路径是
/var/www/public\u html

文件夹结构 /var/www/public_html/.htaccess 通过编辑
composer.json
如果您有命令行访问权限,请更新PHP composer
下面是我在遇到类似情况时采取的一种方法。在
public\u html
目录中安装
wordpress
,最好将
laravel应用程序
放在WP目录中:

wp-admin/  
wp-content/  
wp-includes/  
... other wordpress files ...
app/ <-- laravel application  
     |-> app/
     |-> bootstrap/
     |-> config/
     |-> public/
     |-> ... other laravel files and directories ...
并将服务提供商添加到您的laravel应用程序配置中,
config/app.php:

 /* ... */
   'providers' => [
        // ...

        /*
         * Application Service Providers...
         */
        // ...
        App\Providers\WordPressServiceProvider::class,
现在,我们可以访问Laravel中的WordPress功能,并可以将Laravel
视图更改为类似以下内容:

{!! get_header() !!}
        <div class="container">
            <div class="content">
                <div class="title">Laravel 5</div>
                <div class="quote">{{ Inspiring::quote() }}</div>
            </div>
        </div>
{!! get_footer() !!}
{!!获取_头()!!}
拉维尔5号
{{鼓舞人心的::quote()}
{!!获取页脚()!!}

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

您想在public\u html目录下安装wordpress,还是在public\u html中安装一个子目录,例如public\u html/wordpress?这个答案假设了比问题所暗示的更多的内容,特别是用户对
public\u 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\u html/
之外,用户不能查看任何内容。即使
.htaccess
文件也会被意外删除。正确的说法是,请求必须限制在
公用
文件夹中。我的观点是,您的答案假设Apache具有指向此文件夹的设置,这不是一个合理的假设。对symlink解决方案投一票,可以在Symfony项目之外放置WP站点,只需将指向Laravel公用文件夹的符号链接替换为指向Symfony的web文件夹的符号链接即可。@mnv如果您有1个本地环境和1个生产服务器需要处理,这将有所帮助。当您需要在多个测试服务器上部署解决方案、保留prod部署版本等时,这就变得复杂了。我一直在尝试避免使用符号链接,我觉得这是一种很好的做法。最好将不同的逻辑域分开。我建议使用真实目录而不是符号链接。当然,很大程度上取决于项目的规模和系统的复杂性。这很有趣,但WordPress和Laravel开发的用户基础可能不同。不过,这是在两个应用程序之间建立前端一致性的一种有趣的方法。@Qevo,由于大多数WP功能现在将在Laravel应用程序中可用,我们可以轻松地调整用户身份验证和管理行为,以使用相同的用户群。若你们明白了,事实上,若答案被接受的话,这将更加困难。澄清一下,我指的是开发Laravel或WordPress的不同用户。你做的很好,我没有考虑应用程序之间的认证。我只能假设目前不需要这样做。我明白了,但我相信两个框架的真正集成是两个框架可以无缝交互,而不会向最终用户公开任何内容。否则,我认为不需要任何这样的麻烦。这只是设置符号链接或少量重定向的问题。我认为OP并不关心前端和用户体验的一致性:{
/**
 * 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);
}
"autoload": {    
    //...
    "files": [
        "app/helpers.php"
    ]
},
composer dump-autoload
wp-admin/  
wp-content/  
wp-includes/  
... other wordpress files ...
app/ <-- laravel application  
     |-> app/
     |-> bootstrap/
     |-> config/
     |-> public/
     |-> ... other laravel files and directories ...
// 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!');
    }

}
 /* ... */
   'providers' => [
        // ...

        /*
         * Application Service Providers...
         */
        // ...
        App\Providers\WordPressServiceProvider::class,
{!! get_header() !!}
        <div class="container">
            <div class="content">
                <div class="title">Laravel 5</div>
                <div class="quote">{{ Inspiring::quote() }}</div>
            </div>
        </div>
{!! get_footer() !!}