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