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

У меня есть проект 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 на домен.com. Поэтому, когда вы переходите на домен.com, вы видите веб-сайт WordPress. Но я также хочу иметь URL-адреса, как / назначение моего проекта laravel.

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

Related of "Проект Laravel рядом с проектом WordPress (в папке public_html)"

Вы можете создать символическую ссылку на общедоступный каталог 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 

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

.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 

Вот такой подход, который я принял, когда столкнулся с подобной ситуацией. Установите 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 и может изменять views 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() !!} 

Ваш сайт WordPress должен быть доступен на сайте www.urdomain.com и в приложении laravel по адресу www.urdomain.com/app/appointment или настроить вас .htaccess если вы хотите использовать другой шаблон URL. Надеюсь, эта помощь.