【Laravel/MAMP】URLのpublicをなくしてアクセスできるようにする方法!
この記事からわかること
- Laravel×MAMPでURLからpublicをなくす方法
- .htaccessファイルの設置場所
- サーバーエラーやNot Foundの解決法
- laravel10での方法
- httpd.confファイルの設定を見直す
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelプロジェクトを立ち上げた際にサイトを表示させるURLからpublic
を削除する方法を紹介していきます。
環境
- Laravel:8.83.27
- Laravel Installer:4.2.9
- PHP(MAMP): 8.2.0
- PHP(cli): 8.2.8
- Composer:2.5.8
今回の目標
今回の目標は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つを紹介していきます。
- .htaccessをルート直下に設置する
- 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
と同じ階層に移動させます。
やること
- .htaccessの作成と設置
- public直下ファイルの移動
- 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.php
とserver.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>
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。