У меня есть проект Laravel в папке public_html . Домен, например, domain.com. Мой файл .htaccess (в папке public_html) выглядит следующим образом:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule>
Существуют следующие маршруты:
Таким образом, пример URL-адреса – http://domain.com/appointment .
Теперь я хотел бы иметь сайт WordPress на домен.com. Поэтому, когда вы переходите на домен.com, вы видите веб-сайт WordPress. Но я также хочу иметь URL-адреса, как / назначение моего проекта laravel.
Какой самый простой и чистый способ сделать это?
Вы можете создать символическую ссылку на общедоступный каталог 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
# 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" ] },
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. Надеюсь, эта помощь.