【Laravel/MAMP】URLのpublicをなくしてアクセスできるようにする方法!

この記事からわかること

  • Laravel×MAMPURLからpublicをなくす方法
  • .htaccessファイルの設置場所
  • サーバーエラーNot Found解決法
  • laravel10での方法
  • httpd.confファイルの設定見直す

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelプロジェクトを立ち上げた際にサイトを表示させるURLからpublicを削除する方法を紹介していきます。

環境

今回の目標

今回の目標はLaravelプロジェクトで公開しているWebサイトのURLからpublic除去してもアクセスできるようにすることです。LaravelはデフォルトでトップページにアクセスするためのURLがhttps://ドメイン/public/となります。このままではリリースした時にユーザーにpublicが不審に思われてしまうかもしれないのでこれを無くしていきます。

今回の設定を行うことでリリース版でもローカル版でもWebサイトのURLからpublicを除去することが可能になります。

http://localhost/project/public 
  ↓
http://localhost/project/

または
https://appdev-room.com/public
  ↓
https://appdev-room.com/

LaravelプロジェクトURLからpublicを無くす方法

URLからpublicを無くす方法は複数存在するようですがそれぞれ挙動が異なりました。今回は以下の2つを紹介していきます。

  1. .htaccessをルート直下に設置する
  2. publicフォルダの中身をルート直下に移動する

.htaccessをルート直下に設置する

一番簡単な方法は.htaccessをルート直下(Laravelプロジェクト/)に設置する方法です。Laravelプロジェクト直下には.htaccessはデフォルトで存在しないのでエディタなどで作成し中に以下の内容を記述して設置してください。


<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</IfModule>

これでpublicを抜いたURLでもアクセスできるようになります。

public付きでもアクセスできてしまう

この方法の問題点がpublic付きのURLでもまだアクセスが可能になっている点です。つまり以下のURLで同じページが表示できてしまうようでした。

https://appdev-room.com/php-laravel-mamp-public

https://appdev-room.com/public/php-laravel-mamp-public

publicフォルダの中身をルート直下に移動する

続いての方法はpublicフォルダの中身をルート直下に移動させる方法です。publicフォルダ内にあるリソースファイル(imageやcssなど)以外のindex.phpなどのファイルapp.envと同じ階層に移動させます。

やること

  1. .htaccessの作成と設置
  2. public直下ファイルの移動
  3. index.phpとserver.phpの更新

.htaccessを更新します。


<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # 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>

初期状態

├── Laravelプロジェクト
│ ├── app
│ ├── bootstrap
│ ├── public
│        ├── image
│        ├── css
│        ├── js
│        ├── index.php
│        ├── favicon.ico
│        :         :
│ ├── server.php
│ └── .env

移動後

├── Laravelプロジェクト
│ ├── app
│ ├── bootstrap
│ ├── public
│        ├── .htaccess(設置)
│        ├── image
│        ├── css
│        └── js
│ ├── index.php
│ ├── favicon.ico
│  :         :
│ ├── server.php
│ └── .env

続いて移動させたindex.phpserver.phpの中身を変更していきます。まずはindex.phpの中身の以下のパス部分の/../となっていた部分を/./に置き換えます。


// 19行目
if (file_exists(__DIR__.'/./storage/framework/maintenance.php')) {
    require __DIR__.'/./storage/framework/maintenance.php';
}
// 34行目
require __DIR__.'/./vendor/autoload.php';

// 47行目
$app = require_once __DIR__.'/./bootstrap/app.php';

続いてserver.phpの21行目のパスのpublic/を消去して以下のように変更します。


// 21行目
require_once __DIR__.'/index.php';

これでURLにpublicがない場合でもアクセスできるようになりました。

この手順でうまく動作しない場合は「1 .htaccessをルート直下に設置する」と併用してみてください。

うまくアクセスできない場合の解消法

それでもサーバーエラー(500)やNot Found(404)になってしまう場合はLaravelのバージョンや環境に問題がある可能性があります。私はLaravel8で動作確認が取れましたがLaravel10では.htaccessを設置してもアクセスできませんでした。

また以前は以下の内容の.htaccessを設置していましたがLaravel9よりserver.phpがなくなったらしく、うまく動作しなくなっていました。


<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</IfModule>

httpd.confの設定を見直す

それでもアクセスできない場合はMAMP内の設置で.htaccessが反映されない設定になっている可能性があります。設定を変更するには/Applications/MAMP/conf/apache/にあるhttpd.confの中のAllowOverride Allになっているか確認してください。もしAllowOverride Noneになっていたら反映されないようになっている可能性があるので書き換えてください。


<Directory "/Applications/MAMP/htdocs">
    Options All
    AllowOverride All ⇦ AllowOverride NoneならAllowOverride Allにする
    Require all granted
    XSendFilePath "/Applications/MAMP/htdocs"
</Directory>

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index