Angular + Laravel PHP Routing in .htaccess

81
28 февраля 2022, 22:50

Доброго времени суток.

Have some trouble.

Есть сайт на Angular и сервер на PHP (Laravel).

Заказчик попросил убрать # из урла, после этого при обновлении страницы ловим 404.

RouterModule.forRoot(appRoutes, { useHash: false }),

Посмотрел, как это решается (Методом конфигурации файла .htaccess), но не помогло, ибо там конфликты с PHP.

<IfModule mod_rewrite.c>
  <IfModule mod_negotiation.c>
      Options -MultiViews -Indexes
  </IfModule>
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Файлы index.html и index.php лежат в одной директории - /var/www/satu/public Могу ли я как-то решить эту проблему через файл .htaccess, не меняя местоположение файлов, или надо сделать что-то еще?

Спасибо.

routes/web.php

<?php
Route::group(['prefix' => 'admin'], function () {
    Voyager::routes();
});
// Route for parse CSV files to DB
Route::get('/parseData', 'ParseController@parse');
Route::get('/parseImages', 'ParseController@addImages');
Route::get('/login', 'Web\LoginController@loginForm')->name('loginForm');
Route::post('/login', 'Web\LoginController@login')->name('login');
Route::get('/logout', 'Web\LoginController@logout')->name('logout');
Route::get('/register', 'Web\LoginController@registerForm')->name('registerForm');
Route::post('/register', 'Web\LoginController@register')->name('register');
Route::post('/check-phone', 'Web\LoginController@checkPhone')->name('check_phone');
Route::group(['middleware' => ['auth']], function() {
});
Route::group(['prefix' => 'api/v1.0', 'namespace' => 'Api\v1_0', 'middleware' => ['cors']], function () {
    Route::post('/login', 'LoginController@login');
    Route::post('/web/login', 'LoginController@webLogin');
    Route::post('/register', 'LoginController@register');
    Route::post('/confirm-phone', 'LoginController@confirmPhone');
    Route::post('/resend-confirm-sms', 'LoginController@resendConfirmSms');
    Route::post('/recovery-code-send', 'LoginController@sendRecoveryPasswordCode');
    Route::post('/recovery-password', 'LoginController@recoveryPassword');
    Route::group(['middleware' => ['auth']], function() {
        Route::get('/user', 'LoginController@user')->name('api.user');
        Route::put('/user', 'LoginController@userUpdate')->name('api.user.update');
        Route::post('/contracts/verify', 'PaymentsScheduleController@verify');
        Route::get('/notifications', 'NotificationController@notificationsList');
        Route::put('/user/token', 'LoginController@updateToken');
    });
});
Route::get('/api/soap/logs', 'Web\LogsController@showLogs')->name('admin.soap.logs');
Route::get('/api/soap/fix', 'Web\LogsController@fixLogs')->name('admin.soap.fix');
Route::get('/postman', function () {
    return view('welcome');
})->name('index');
Answer 1

Это SPA с маршрутизацией по history api. По поводу фронта ничего не скажу, но по бэку .htacess трогать не надо. Нужно настроить маршруты в laravel.

Конкретно в laravel должен быть маршрут, принимающий любой url, который возвращает страницу инициализации SPA приложения.

К сожалению вы не указали версию laravel, поэтому примем версию 5.5.* - 6.* в файле routes/web.php надо вместо машрута / создать маршут такой (в самом низу)

Route::get('{url}', 'Controller@enty')->where('url', '.*');
Answer 2

Урлы строятся с хэшом не на стороне laravel, а на стороне angular.

Нужно изменить в машрутизации ангуляра LocationStrategy на PathLocationStrategy

READ ALSO
strpos с отрицательным смещением

strpos с отрицательным смещением

согласно документации код верный, почему не находит позицию?

98
Laravel связь один ко многим

Laravel связь один ко многим

У меня есть связь один ко многим

89
проверить, есть ли параметр &quot;?&quot; в url php

проверить, есть ли параметр "?" в url php

Как проверить есть ли "?" в url, не зная конкретного параметра

111
Почему Composer устанавливает старую версию Laravel?

Почему Composer устанавливает старую версию Laravel?

Пытаюсь установить Laravel при помощи Composer, но устанавливается версия Laravel 58, хотя уже давно есть версии 6

115