質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

2回答

1315閲覧

Laravelで管理画面付きのHPを作る際のディレクトリ構成について

avantgarden

総合スコア121

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/05/15 13:51

編集2021/05/15 13:52

これまで、Laravelで簡単な社内向けシステムを作ってきました。今度、管理画面つきのホームページをLaravelで組もうと思ってるのですが、はたとディレクト構成のことで悩み出しました。

社内向けシステムの時は、言ってみれば管理画面のみを作るということだったのでディレクトリ構成に悩むということありませんでした。

管理画面は、少し省略しますが

httpdocs/  └ admin/   ├ app/   │ └ Http/   │ └ Controllers/   │ └ NewsController.php   ├ resources/   │ └ views/   │ └ news/   │ └ index.blade.hphp   ├ routes/   │ └ web.php   └ public/ └ index.php

という構成で、下記のようなルーティングを設定し

Route::get('/news', [App\Http\Controllers\NewsController::class, 'index']);

https://sample.com/admin/news/にアクセスすれば管理画面のお知らせ一覧を出す、などといった形にしています。

フロント側をまったく考慮していなかったので、ドキュメントルートは/httpdocs/admin/にしており、/httodocs/admin/.htacces

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

の処理を書いて、/public/index.phpが起点になるようにしています。

この状態だと、例えばフロント側のニュース一覧のURLをhttps://sample.com/news/と想定したとすると、Laravelアプリケーションを動かすことができないかと思います。

ドキュメントルートやディレクトリ構成を一から考え直す必要があると思っているのですが、フロントありでLaravelの開発をしたことがなく、どういう構成にすればいいのかが考え付きません。

フロントと管理画面をセットで組む場合、一般的にどうこう構成にするのがセオリーというのはあるのでしょうか。

周囲でもLaravelでのノウハウがなく、参考にできるアプリケーションもないので自分で調べたりしているのですが、意外と情報が見つからずに悩んでいます。

何かヒントになるようなことでも教えていただけると有難いです。
サーバー環境はCentOS8、PHP7.4+MySQL、Laravelは8.12です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Laravelは常に、Webサーバで設定する「Webディレクトリ」のルートから提供するべきです。WebディレクトリのサブディレクトリからLaravelアプリケーションを提供しないでください。そうしてしまうと、アプリケーション内に存在する機密ファイルが漏洩する可能性があります。

https://readouble.com/laravel/8.x/ja/installation.html

解決策は、基本一つです。
それはシンボリックリンクを貼る方法です。

htdocsの親ディレクトリにLaravelのプロジェクトをClone(もしくはそれに準ずる方法でアップロードし)、そのプロジェクト内へのシンボリックリンクを、htdocsディレクトリの中に、adminという名前で作成してください。

投稿2021/05/15 14:52

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

avantgarden

2021/05/15 15:36

ありがとうございます。 ・サーバーのドキュメントルートは/htdocsに変更 ・下記のディレクトリ構成に変更 admin/ ├ app/ │ └ Http/ │ └ Controllers/ │ └ NewsController.php ├ resources/ │ └ views/ │ └ news/ │ └ index.blade.hphp ├ routes/ │ └ web.php htdocs/ ├ admin/ │ └ index.php (管理画面の起点となるindex.php) └ index.php (フロント側の起点となるindex.php) ・下記のシンボリックリンクを張る ln -s /var/www/admin/public /var/www/htdocs/admin/ という理解で合ってますでしょうか。 フロント側のアプリケーションをどう配置するかという疑問が残ります。 そもそも上記の理解が間違っていたらすみません…
avantgarden

2021/05/16 14:17 編集

すいません、内容を理解しまして、ディレクトリ構成とシンボリックリンクを下記のように変更しました。サーバーのドキュメントルートは/htdocsです。 project/ (プロジェクト名がadminである必要はないので適当に変更) ├ app/ │ └ Http/ │ └ Controllers/ │ └ NewsController.php ├ resources/ │ └ views/ │ └ news/ │ └ index.blade.hphp ├ routes/ │ └ web.php ├ public/ │ └ index.php htdocs/ └ admin(/var/www/project/publicへのシンボリックリンク) シンボリックリンク:「ln -s /var/www/project/public admin」 これで、 https://sample.com/admin へのアクセスで管理画面のアプリケーションは動きました。 ただ、2点疑問が出てきました。 ■ルーティングの変更が必要かと思ったのですが、上記構成に変更後も、 Route::get('/news', [App\Http\Controllers\NewsController::class, 'index']); https://sample.com/admin/news にアクセスしてもエラーになりません。 Route::get('/admin/news', [App\Http\Controllers\NewsController::class, 'index']); と変更せずに動く理由が分かりません… ■https://sample.com/news とアクセスした場合もLaravelアプリケーションが動くようにしたいですが、どのようにシンボリックリンクを張ればいいでしょうか?Laravelの/public/index.phpにたどり着ければ、あとはルーティングで管理画面とフロントの処理を分ければいけると思うのですが。
guest

0

https://sample.com/news

とアクセスした場合もLaravelアプリケーションが動くようにしたいですが、どのようにシンボリックリンクを張ればいいでしょうか?Laravelの/public/index.phpにたどり着ければ、あとはルーティングで管理画面とフロントの処理を分ければいけると思うのですが。

一つの手段ではありますが、ドキュメントルートの .htaccess でリクエストに対する処理を無理やり /public/index.php にねじ曲げる方法があります。

# .htaccess RewriteCond %{REQUEST_URI} ^/news.*$ RewriteRule ^ /admin/index.php [L] # project/public/index.phpの場所

上記のように記載することで、 https://sample.com/news に対するリクエストをindex.phpで受け取ることができます。

ただ、もしこのサイトを修正する時間があるのであれば、ドキュメントルートを public/index.php に振り直してルーティングを適切に組み直したり、Laravelの処理を特定のディレクトリ配下に封じ込めることをお勧めします。
(/news/配下に封じ込めるのであれば、/news/index.phpなどでLaravelのindex.phpが起動するように設定するなど)
バックエンドの知見は深いようにお見受けしたので当然承知の上とは思いますが、推奨されていない歪な実装は今後拡張する上で間違いなく身動きが取れなくなると思います。

投稿2021/05/27 10:03

Tatsuki-sth

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問