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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

1回答

3101閲覧

Laravelの.htaccess内のRewriteRuleの処理について確認させてください。

spiderindigo

総合スコア20

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

1グッド

0クリップ

投稿2022/04/16 18:24

編集2022/04/17 05:24

現在Laravelのルーティングについて勉強しております。
Laravelプロジェクトのpublicフォルダにある.htaccessファイルの中でリクエストURLがpublicフォルダ内のファイルでもディレクトリでもない場合にindex.phpを実行するという記述があります。
その記述の中でURLを書き換えているRewriteRule ^ index.phpの部分について2点確認させてください。

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

前提条件

・ドキュメントルートは、XAMPPでインストールしたApacheの設定ファイルXAMPP\apache\conf\httpd.confで変更可能ですが特にいじっていないためルートディレクトリドキュメントルートはD:\XAMPP\XAMPP\htdocsです。
そのためhttp://localhostではD:\XAMPP\XAMPP\htdocs\index.phpによりhttp://localhost/dashboard/にリダイレクトされます。

・ドキュメントルートD:\XAMPP\XAMPP\htdocs配下にfirstlaravelというLaravelプロジェクトを作成しました。

・.htaccessファイルはD:\XAMPP\XAMPP\htdocs\firstlaravel\publicに配置しています。
リクエストURLはhttp://localhost/firstlaravel/public/helloを想定しています。

・ここまで記載した前提条件ですが下記のサイトに沿ってHello World!が表示されるようにした結果となります。
https://codezine.jp/article/detail/11231

質問

①RewriteBaseは記載されていないとデフォルトで/firstlaravel/publicで認識あっておりますでしょうか?

RewriteRule ^ index.phpでは「^」のみの記述だと「全ての行」を表すと聞きました。

(4)のRewriteRuleに記述したルールにのっとってリクエストを移管します。RewriteRuleは、最初に移管元のパスパターンを記述し、続けて移管先のパスパターンを記述します。ここでは移管元のパスパターンとして「^」を記述しています。「^」は行頭を表す記号で、例えば、「^こんにちは」というのは、「こんにちは」から始まる行を表します。その行頭記号の後ろに何も記述がない場合は「全ての行」を表します。移管先がindex.phpです。

https://codezine.jp/article/detail/11370
ここでいうと「全ての行」とはリクエストURLの/firstlaravel/public/helloを表していて、
移管後はRewriteBaseの/firstlaravel/publicと移管先のindex.phpを合わせた、
/firstlaravel/public/index.phpになるという認識であっておりますでしょうか?

調べてもはっきりと記載されている記事が見つけられなかったため確認していただけますと幸いです。

kenken397👍を押しています

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

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

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

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

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

m.ts10806

2022/04/16 21:00

>http://localhost/firstlaravel/public/hello 正しくインストレーションできていれば、ドキュメントルートがpublicとなってURLにpublicは入らないので("public/hello"というルーティング切っているなら申し訳ない)前提が間違っているような。
spiderindigo

2022/04/17 05:26

ご確認いただきありがとうございます。 前提を修正させて頂きました。XAMPPのApacheを使っているのですが、そちらの設定を変更していないため現状ドキュメントルートは`D:\XAMPP\XAMPP\htdocs`となっております。
m.ts10806

2022/04/17 05:39

そういうわけではなく、LaravelのドキュメントルートはLaravelプロジェクトのpublicディレクトリにするというのがLaravel導入部分の説明です。 public入ってる時点で間違ってます。
spiderindigo

2022/04/17 07:06

申し訳ございません。本来であればLaravelのpublicディレクトリをドキュメントルートに設定するということは認識しておりますが現状、https://codezine.jp/article/detail/11370 の記事に沿ってやっている為そのように設定はしておりません。 確認したところドキュメントルートが`D:\XAMPP\XAMPP\htdocs`の状態でも.htaccessによって問題なくURLの置換が行われておりました。 どういう処理がLaravelの.htaccess内のRewriteRuleでおこなわれているのかという観点でご確認いただけますと幸いです。
guest

回答1

0

ベストアンサー

①RewriteBaseは記載されていないとデフォルトで/firstlaravel/publicで認識あっておりますでしょうか?

いいえ。RewriteBaseは、「書き換え後のパスが相対パスの場合(/で始まっていない場合)、その相対パスの
起点となる場所」ですが、デフォルトでは、カレントディレクトリです。

htaccessファイルはD:\XAMPP\XAMPP\htdocs\firstlaravel\publicに配置しています。

ということなので、この場合はRewriteBaseはおそらく/XAMPP/XAMPP/htdocs/firstlaravel/publicですね。ドライブレターD:がどういう事になるのかは知りませんが、もしかしたら何らかの形でDが付くのかも。

「^」のみの記述だと「全ての行」を表すと聞きました。

「聞きました」ということは正規表現について全く知らないと言うことですかね。リライト・リダイレクトを行う場合は、少なくとも正規表現の初歩くらいは知っておくと間違いが防げます。

ここでいうと「全ての行」とはリクエストURLの/firstlaravel/public/helloを表していて、移管後はRewriteBaseの/firstlaravel/publicと移管先のindex.phpを合わせた、/firstlaravel/public/index.phpになるという認識であっておりますでしょうか?

RewriteRuleのマッチング対象は、.htaccessの置かれている場所からの相対パスなので、この場合はhelloがマッチング対象です。これが^とマッチするので、index.htmlに書き換えられ、これが/で始まらない相対パスなので、RewriteBaseが補われて/XAMPP/XAMPP/htdocs/firstlaravel/public/index.htmlになるはずです。
おそらくこれは間違いでしょうから、RewriteBase /firstlaravel/publicと書いておくか、そもそも相対パスを使わず、RewriteRule ^ /firstlaravel/public/index.htmlと書くのが良いでしょう。

投稿2022/04/17 00:39

otn

総合スコア84533

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

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

spiderindigo

2022/04/17 06:55

ご確認いただきありがとうございます。とても分かりやすかったです。 >おそらくこれは間違いでしょうから、RewriteBase /firstlaravel/publicと書いておくか、そもそも相対パスを使わず、RewriteRule ^ /firstlaravel/public/index.htmlと書くのが良いでしょう。 こちらの記載について確認させてください。 恐らく間違えているというのは現状の記述でRewriteRuleを実施すると変換後が`http://localhost/firstlaravel/public/XAMPP/XAMPP/htdocs/firstlaravel/public/index.php` になってしまう為間違えているというイメージで認識合いますでしょうか? 実際にotnさんからご提案頂いたパターンと現状のパターン3つで確認致しました。 その結果いずれの場合も特にエラーなくindex.phpが動いていそうです。 こちらの結果はotnさんからすると想定通りとなりますでしょうか? 申し訳ございませんがご確認いただけますと幸いです。 パターン① ``` # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] ``` パターン② ``` # Send Requests To Front Controller... RewriteBase /firstlaravel/public RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] ``` パターン③ ``` # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ /firstlaravel/public/index.php ```
otn

2022/04/17 08:45

> 恐らく間違えているというのは現状の記述でRewriteRuleを実施すると変換後が`http://localhost/firstlaravel/public/XAMPP/XAMPP/htdocs/firstlaravel/public/index.php`になってしまう為間違えているというイメージで認識合いますでしょうか? はい。回答にはそのように書きました。 パターン1の場合は、別の所にRewriteBaseが書かれているのではないでしょうか。
spiderindigo

2022/04/18 13:35

ご確認いただきありがとうございます。 別のところで定義されている可能性をつぶすためにRewriteRuleで新しく作ったファイルにURLを書き換えるようにしたところいずれのパターンでも問題なく動いたため別ファイルでRewriteRuleが書かれているわけではなさそうでした。 調べても明記されているものを見つけられなかったので考察になってしまいますが、矛盾はないので実際の挙動はこうではないかと考えております。 [1]まず`RewriteRule ^ index.php`についてですが、正規表現^にマッチした部分のみを置換するのではなく、正規表現にマッチするURLだった場合はhttp://localhost以下すべてを置換するのではないかと思います。 [2]次に.htaccessについてです。.htaccessをルーティングに使うためには、Apacheの設定ファイル(httpd.cnf)の<Directory>タブ内でAllowOverride Allと記載する必要があります。自分の環境のhttpd.cnfについて確認したところルートディレクトリに対して.htaccessを使用するための設定をしてありました。 .htaccessを使用するにあたって、Apacheのルートディレクトリに対して.htaccessを使用できるように設定をしているので、.htaccessが自身のパスをルートディレクトリから見てのパスとして保持しているという仕様はあってもおかしくないように思います。 そのためRewriteBaseは省略した場合、現在のディレクトリとして`/firstlaravel/public`を暗黙的に保持しているのではないかと考えております。 .htaccessの仕様がもし[1]と[2]のようであった場合パターン①~③すべてで結果的にURLが`http://localhost/firstlaravel/public/index.php`となり問題なく動いたことも納得できます。 上記の二つは明記されている資料とかは見つけられなかったため予想となりますが、これは確実に間違えているなどありましたらご指摘お願い致します。
otn

2022/04/18 22:15

パターン1: 失礼しました。別の質問のリダイレクトのケースと混同していた気がします。 RewriteRule ^ index.php [R,L] のようなリダイレクトであれば、http://localhost/XAMPP/XAMPP/htdocs/firstlaravel/public/index.phpに リダイレクトされてしまうわけですが、今回は、リダイレクトじゃないので、「読み込み対象ファイルが/XAMPP/XAMPP/htdocs/firstlaravel/public/index.phpになる」ということで、問題なく動きます。 失礼しました。 > [1]まず`RewriteRule ^ index.php`についてですが、正規表現^にマッチした部分のみを置換するのではなく、正規表現にマッチするURLだった場合はhttp://localhost以下すべてを置換するのではないかと思います。 マッチする部分だけを置換するのではないというのはその通りです。 > そのためRewriteBaseは省略した場合、現在のディレクトリとして`/firstlaravel/public`を暗黙的に保持しているのではないかと考えております。 この部分は間違いで、回答に書いた通り、.htaccess が存在するディレクトリのOS的な意味での(絶対)パスになります。リダイレクトでない場合は、そこのファイルをそのまま読むのでカレントディレクトリから読めます。 [R]を付けてリダイレクトにしてみると、OS的な意味でのパスになっていることがわかると思います。 蛇足的に説明すると、RewriteBaseを指定したり、RewriteRuleの書き換え先が / から始まる絶対パスであった場合は、URL-Pathと見なされ、DocumentRootと合成されてOS的なパスが求まって、そのファイルを読みます。
spiderindigo

2022/04/29 15:45

回答していただいているのに気が付かず反応遅れてしまい申し訳ございませんでした。 実際に教えていただいた内容を試してみようと思います。 確実にotnさんの回答がベストアンサーなのですが一応実際に確認ができてからベストアンサーにさせて頂きます。申し訳ございませんが今しばらくお待ちいただけますと幸いです。
spiderindigo

2022/04/30 08:08

リダイレクトのパターンをいくつか試してみました。ご教授頂いた内容理解できたと思います。 丁寧に教えてくださり本当にありがとうございました。 一応以下に試したパターンを記載いたします。 パターン① ``` # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [R=301,L] ``` ⇒`http://localhost/D:/XAMPP/XAMPP/htdocs/firstlaravel/public/index.php` `RewriteRule ^ index.php [R=301,L]`のようにindex.phpが相対パスのときに、RewriteBaseを指定しない場合は、.htaccessが配置されているディレクトリのフルパス(`D:/XAMPP/XAMPP/htdocs/firstlaravel/public/`)で補われることが確認できました。 パターン② ``` # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ /index.php [R=301,L] ``` ⇒`http://localhost/index.php/` `RewriteRule ^ /index.php [R=301,L]`の / がドキュメントルート(`D:\XAMPP\XAMPP\htdocs`)を示しており、URLではドキュメントルートは省略される為`http://localhost/index.php/`にアクセスします。(XAMPPのドキュメントルートにあるindex.php) index.phpが実行されると`http://localhost/dashboard/`にアクセスする記載があるため最終的にブラウザには`http://localhost/dashboard/`が表示されました。 パターン③ ``` # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ /firstlaravel/public/index.php [R=301,L] ``` ⇒`http://localhost/firstlaravel/public/index.php` / から始まるパスの為、ドキュメントルートからのパスであると認識されて、`http://localhost/firstlaravel/public/index.php`になることが確認できました。 パターン④ ``` # Send Requests To Front Controller... RewriteBase /firstlaravel/public RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [R=301,L] ``` ⇒`http://localhost/firstlaravel/public/index.php` RewriteBaseを指定した場合、カレントディレクトリ基準である相対パスでRewriteRuleを記述したとしてもRewriteBaseでURLが補われる為、`http://localhost/firstlaravel/public/index.php`となることが確認できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問