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

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

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Есть следующие маршруты:

апи / licenseplateапи / календарьавториз / Войтиадминистратор / настройкиадминистратор / назначениеделовое свидание, встреча...

Таким образом, пример URLhttp://domain.com/appointment.

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

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

 revo04 авг. 2016 г., 23:38
Хотите ли вы установить WordPress в каталоге public_html или в подкаталоге внутри public_html, например? public_html / WordPress?

Ответы на вопрос(3)

Решение Вопроса

в папке 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
 Rafal Kozlowski10 авг. 2016 г., 14:55
Будьте осторожны с символическими ссылками. У меня были серьезные проблемы с ними при работе с git и различными сценариями развертывания (python и ansistrano playbook).
 mnv10 авг. 2016 г., 14:59
@Rafal Kozlowski, я верю, что добавлениеlaravel/public/wp в.gitignore в этом случае хороший способ.
 Qevo10 авг. 2016 г., 07:30
Вы правы, что запросы должны быть ограниченыpublic папка. Я хочу сказать, что ваш ответ предполагает, что Apache имеет настройки, которые указывают на эту папку, и это не является разумным предположением.
 Qevo10 авг. 2016 г., 01:47
Этот ответ предполагает больше, чем предполагает вопрос, в частности, что пользователь имеет большой контроль над родительскими каталогамиpublic_html, Также странно иметь/var/www/wordpress/public_html и ничто не говорит Apache, чтобы посмотреть в/var/www/laravel/public/.htaccess для запросов кdomain.com.
 Thai Duong Tran10 авг. 2016 г., 09:46
Одно замечание по решению Symlink, то же самое можно сделать, чтобы разместить сайт WP помимо проекта Symfony, просто замените символическую ссылку на общую папку Laravel на ссылку на веб-страницу Symfony.
 mnv10 авг. 2016 г., 06:59
Qevo, веб-сервер должен изучить/var/www/laravel/public/, Это более безопасное решение. При таком подходе пользователь не может просматривать ничего кроме/var/www/laravel/public/ а также/var/www/wordpress/public_html/, Даже если.htaccess файлы будут случайно удалены.
 Rafal Kozlowski10 авг. 2016 г., 15:05
@mnv это поможет, если у вас есть 1 локальная среда и 1 производственный сервер. Это становится сложным, когда вам нужно развернуть решения на нескольких тестовых серверах, сохранить версии развертывания prod и т. Д. Я всегда стараюсь избегать использования символических ссылок, и у меня есть ощущение, что это хорошая практика. Всегда лучше так разделять разные домены логикой. Я бы предложил использовать реальные каталоги вместо символических ссылок. Конечно, многое зависит от размера проекта и сложности системы.

который я использовал, когда столкнулся с подобной ситуацией. Установите свой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 и мы можем изменять laravelviews что-то вроде:

{!! 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 под URLwww.urdomain.com/app/appointment или настроить вас.htaccess если вы хотите другой шаблон URL. Надеюсь, это поможет.

 Amar Pratap10 авг. 2016 г., 10:13
Я думаю, что OP не заботится о совместимости внешнего интерфейса и UX: {
 Qevo10 авг. 2016 г., 01:51
Это интересно, но есть вероятность, что для разработки на WordPress и Laravel существуют разные пользовательские базы. Тем не менее, интригующий способ установить согласованность между двумя приложениями.
 Amar Pratap10 авг. 2016 г., 10:09
Я вижу, но я верю, что истинная интеграция двух фреймворков - это то, где обе могут взаимодействовать без каких-либо проблем для конечных пользователей. В противном случае, я не думаю, что есть необходимость в подобных неприятностях. Это всего лишь вопрос настройки символических ссылок и / или нескольких перенаправлений.
 Qevo10 авг. 2016 г., 09:47
Чтобы уточнить, я имел в виду разных пользователей, которые будут разрабатывать Laravel или WordPress. Вы делаете очень хорошее замечание о том, что я не учитывал аутентификацию между приложениями. Я могу только предположить, что это не нужно в настоящее время.
 Amar Pratap10 авг. 2016 г., 09:07
@Qevo, так как большинство функций WP теперь будут доступны в Laravel App, мы можем легко настроить поведение аутентификации и управления пользователями для использования одной и той же базы пользователей. Если вы видите, на самом деле это будет сложнее в случае принятого ответа.
Структура сервера

.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
composer dump-autoload

Ваш ответ на вопрос