作成日:2024-03-19, 更新日:2024-03-21
やりたいこと
既存サイトがある…特定のフォルダへのアクセスをlaravelで対応・表示させたい
.htaccessでの対応は避けたいんだけど…私では解決できそうになかった(※「laravel 既存サイトにlaravelを追加」)
既存サイトの構成
- /public
- /public/css
- /public/js
- /public/index.php
- /public/about.html
laravel追加後の構成
「public/index.php」がすでにいるのでlaravelで使えない…という問題がある
- /public
- /public/css
- /public/js
- /public/index.php
- /public/about.html
- /public/laravel.php← 追加
- /public/.htaccess← 追加
- 他、laravelのファイルたち
各設定
既存サイトで「/public/index.php」が使われているので特定のアクセスに対してlaravelのindex.phpを読むようにしたい
/public/laravel.php← 追加
- laravelインストール時の「/public/index.php」をリネームして「/public/laravel.php」にする
/public/.htaccess← 追加
幸いなことに既存サイトに.htaccessがいなかったのでそのままいけそう
- laravelインストール時の「/public/.htaccess」を修正
laravelインストール時の「/public/.htaccess」を修正
「http://exampe.com/contents1」配下、「http://exampe.com/contents2」配下のアクセスをすべて「/public/laravel.php」を読むように設定を追記
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On RewriteBase / # ============================================== # Laravel設定 RewriteRule ^contents1(/.*)?$ laravel.php$1 [L,QSA] RewriteRule ^contents2(/.*)?$ laravel.php$1 [L,QSA] # ============================================== # Authorizationヘッダー # ▼contents1、contents2で条件を絞る。元からある「.htaccess」の設定や他のフレームワークとの競合を避ける RewriteCond %{REQUEST_URI} ^/contents1 [OR] RewriteCond %{REQUEST_URI} ^/contents2 [OR] RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # # ▼contents1、contents2以外の設定。必要に応じて設定 # RewriteCond %{REQUEST_URI} !^/contents1 # RewriteCond %{REQUEST_URI} !^/contents2 # RewriteCond %{HTTP:Authorization} . # RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # ============================================== # Trailing Slashリダイレクト # ▼contents1、contents2で条件を絞る。元からある「.htaccess」の設定や他のフレームワークとの競合を避ける…必要はないと思うけど念のため RewriteCond %{REQUEST_URI} ^/contents1 [OR] RewriteCond %{REQUEST_URI} ^/contents2 [OR] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # # ▼contents1、contents2以外の設定。必要に応じて設定 # RewriteCond %{REQUEST_URI} !^/contents1 # RewriteCond %{REQUEST_URI} !^/contents2 # RewriteCond %{REQUEST_FILENAME} !-d # RewriteCond %{REQUEST_URI} (.+)/$ # RewriteRule ^ %1 [L,R=301] # ============================================== # laravelインストール時にあった「.htaccess」の記述 # # 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] # Send Requests To Front Controller... # RewriteCond %{REQUEST_FILENAME} !-d # RewriteCond %{REQUEST_FILENAME} !-f # RewriteRule ^ index.php [L] </IfModule>
※「RewriteRule ^ index.php [L]」はひとまず不要。別のフレームワークでの設定で使われているなら必要
「public」じゃなく「public_html」の場合
現状、「public」で問題ないんだけど、いずれ「public_html」や「htdocs」など、フォルダの構成が変更になるかもしれないので…メモだけ
※実際に試していないので動作するかは不明
- public/index.php ← laravelインストール時のファイル。上記の流れでいくならpublic/laravel.php
- app/Providers/AppServiceProvider.php
- vite.config.js
public/index.php ← laravelインストール時のファイル。上記の流れでいくならpublic/laravel.php
public/index.phpをpublic_html/index.phpにするだけなら変更不要だけど、階層がかわるなら修正が必要
▼複数ある下記PATHを正しいPATHに書き換える
__DIR__.'/../vendor/autoload.php'
app/Providers/AppServiceProvider.php
register()に「path.public」の設定追加
public function register(): void { $this->app->bind('path.public', function () { return base_path() . '/public_html'; }); }
vite.config.js
publicDirectoryを追加
plugins: [ laravel({ publicDirectory: './public_html', input: ['resources/css/app.css', 'resources/js/app.js'], refresh: true, }),