Проект Laravel рядом с проектом Wordpress (в папке public_html)

18

У меня есть проект Laravel в папке public_html. Домен, например, domain.com. Мой файл .htaccess(в папке public_html) выглядит следующим образом:

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Существуют следующие маршруты:

  • апи /licenseplate
  • апи/календарь
  • авториз/Логин
  • админ/Настройки
  • администратора/назначения
  • Назначение
  • ...

Таким образом, пример URL-адреса http://domain.com/appointment.

Теперь я хотел бы иметь сайт WordPress на сайте domain.com. Поэтому, когда вы переходите на домен .com, вы видите веб-сайт Wordpress. Но я также хочу иметь URL-адреса, как/назначение моего проекта laravel.

Какой самый простой и чистый способ сделать это?

  • 0
    Вы хотите установить wordpress в каталог public_html или подкаталог внутри public_html, например public_html / wordpress?
Теги:
.htaccess
http

3 ответа

12
Лучший ответ

Вы можете создать символическую ссылку на общедоступный каталог Wordpress в папке Laravel. Например, wp:

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

И описать маршруты Laravel в .htaccess. Пример кода /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
  • 0
    Этот ответ предполагает больше, чем предполагает вопрос, в частности, что пользователь имеет большой контроль над родительскими каталогами public_html . Также странно иметь /var/www/wordpress/public_html и Apache ничего не говорит искать в /var/www/laravel/public/.htaccess запросах к domain.com .
  • 0
    Qevo, веб-сервер должен искать в /var/www/laravel/public/ . Это более безопасное решение. При таком подходе пользователь не может ничего просматривать, кроме /var/www/laravel/public/ и /var/www/wordpress/public_html/ . Даже если файлы .htaccess будут случайно удалены.
Показать ещё 5 комментариев
3

Структура сервера

.htaccess файлы обеспечивают способ внесения изменений конфигурации для каждого каталога. Это означает, что вам нужно только направлять запрос в каталог, в котором будут правила для того, как наилучшим образом обрабатывать запрос. Таким образом, вы оставите файлы .htaccess, которые поставляются с Laravel и WordPress в своих каталогах. Просто создайте еще один для родительского каталога, который удерживает их обоих.

Далее предполагается, что полный путь 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 создан, чтобы легко разрешить установку в подкаталог, поэтому вам нужно только изменить адрес и адрес сайта WordPress на экране общих настроек.

Laravel предполагает, что он установлен в верхний каталог. asset() помощник используется для создания путей к файлам активов. Поэтому вам нужно будет переопределить функцию по умолчанию с помощью одной из ваших собственных. Вот как:

Создайте 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);
}

Добавьте app/helpers.php в процесс автозагрузки, отредактировав composer.json

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

Если у вас есть доступ к командной строке, обновите PHP-композитор

composer dump-autoload
2

Вот такой подход, который я принял, когда столкнулся с подобной ситуацией. Установите каталог 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 ...

Теперь, чтобы получить WordPress functions в вашем Laravel application, включите wp-load.php в вашу установку Laravelи затем вы можете использовать enqueueing functions от wordpress до загрузите необходимые вам ресурсы.

Лучший подход - следовать архитектуре поставщика услуг 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,

Теперь у нас есть доступ к нашим функциям WordPress в Laravel и может изменить 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 и в приложении laravel под URL www.urdomain.com/app/appointment или настроить .htaccess, если вы хотите использовать другой шаблон URL. Надеюсь на эту помощь.

  • 0
    Это интересно, но есть вероятность, что для разработки на WordPress и Laravel существуют разные пользовательские базы. Тем не менее, интригующий способ установить согласованность внешнего интерфейса между двумя приложениями.
  • 0
    @Qevo, так как большинство функций WP теперь будут доступны в Laravel App, мы можем легко настроить поведение аутентификации и управления пользователями для использования одной и той же базы пользователей. Если вы видите, на самом деле это будет сложнее в случае принятого ответа.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню