laravel 既存サイトにlaravelを追加(.htaccess)

特定のフォルダ内のみlaravelで表示させたい

作成日: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,
    }),