こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

htaccess mod_rewriteのドット

ワードプレスをインストールし.htaccessをのぞいてみると以下のようにあります。
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

一番下のRewriteRuleは%{REQUEST_FILENAME}がルートディレクトリ直下にあるファイルやディレクトリでなければ、RewriteRule . /index.php [L]を実行するという理解でいいでしょうか?

それとRewriteRule . /index.php [L]のドットはどういう意味でしょうか?
ドットは一文字ということだとおもいますが、では、mysite.co.jp/kはmysite.co.jp/indx.phpに修正される?ということでしょうか?現状では、mysite.co,jp以下に適当な文字列を入力してmysite.co.jp/dgfdhgfghfdhなどとしてもそのURLのままサイトが表示されてしまいます。記事の部分は404NotFoundなのですが。。

情報はあるのですが、調べても混乱してしまうのでご存知でしたらよろしくお願いいたします。

Apache wordpress

投稿日時 - 2019-05-24 16:51:47

QNo.9619641

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

> 直下でも3階層下でも(例えば/path/to/existingfile)、それが実在するパスならという風に見えます。

はい。その通りで、すぐ下(直下)だけでなく、何階層か下に実在したときも対象です。

この場合
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
と、  !  があるので、 意味が反転して、 
ファイルやディレクトリとして実在しないときにRewriteRule の対象となりますが。

元のご質問では、
「一番下のRewriteRuleは%{REQUEST_FILENAME}がルートディレクトリ直下にあるファイルやディレクトリでなければ、RewriteRule . /index.php [L]を実行するという理解でいいでしょうか?」
で、 ”直下”と 記述されていたので、
直下だけでなく、階層のしたも 対象ですよ。と補足させて頂いた次第です。


それと、先に回答した
RewriteRule . /index.php [L]
の  . / を ./ (相対パス) と完全に誤読しておりました。申し訳ありません。
これは、取消させて下さい。

このRewriteRuleの
. は 正規表現で 1文字 (空文字以外)
/index.phpは ドキュメントルート直下のindex.php
となります。

 . を .htaccess設置のディレクトリ以外とするのは 多少誤解があるかもしれません。

たとえば
http://example.com/hoge
へのアクセスで
http://example.com/ のドキュメントルートのディレクトリに.htaccessを設置したとして

で hogeというファイルもディレクトリもないなら
http://example.com/index.phpへrewriteされます
それを「.htaccessを設置したディレクトリ以外への要求である場合」
という文脈ですと
上記は、.htaccessを設置しらディレクトリ(のhoge)への要求なので
Rewriteしてくれないことになってしまいますので。

投稿日時 - 2019-06-01 23:42:44

ANo.2

> 一番下のRewriteRuleは%{REQUEST_FILENAME}がルートディレクトリ直下にあるファイルやディレクトリでなければ、RewriteRule . /index.php [L]を実行するという理解でいいでしょうか?

ディレクトリの"直下"でなく、ディレクトリ”階層下のどこか”にファイルやディレクトリがなければ
ですが、基本的にはそれであっています。

>それとRewriteRule . /index.php [L]のドットはどういう意味でしょうか?

正規表現が使える項目では、確かに
 . は任意の1文字、.* は任意の文字列ですが、
上記の ./index.phpの . は正規表現の任意の1文字ではなくて、
./  で 相対パス指定でのカレントディレクトリを意味しています。

HTMLでサイト内へのリンク等を、URLが移転しても
書きかえなくてすむように相対パスで記述するときに
a href="./xxx/yyy.html"

img src="./img/xx.png"
のように記述するときに使っている ./ と同じ意味です。

投稿日時 - 2019-05-30 08:48:17

お礼

コメントありがとうございます。
>ディレクトリの"直下"でなく、ディレクトリ”階層下のどこか”にファイルやディレクトリがなければ
ですが、基本的にはそれであっています。
こちらのソースはありますでしょうか?
https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
ドキュメントは読んでいましたが、直下でも3階層下でも(例えば/path/to/existing file)、それが実在するパスならという風に見えます。

ドットについてはようやくわかりました。
RewriteRuleの書式は以下のように、相対パスの「./」ではなく、. と 置換文字列で、(ドットと/の間にスペースあります。)
RewriteRule パターンターゲット[ Flag1 、Flag2 、Flag3 ]
ドットは以下のサイトで「.htaccessを設置したディレクトリ以外への要求である場合」と判明しました。単なる正規表現じゃなかったようです。ようやく理解できました。
http://algorhythnn.jp/blg/url-redirect/rewriterule/mod_rewrite-rewriterule-dot/
"その為「.」は、
「.htaccessを設置したディレクトリ以外への要求である場合」として解釈が行えます。"

だから、
mysite.co.jp/kだろうが、
mysite.co.jp/dgfdhgfghfdhだろうが、.htaccessを設置したディレクトリ以外への要求であるために/index.phpにリダイレクトされていたということのようです。

投稿日時 - 2019-06-01 16:58:10

ANo.1

WordPressで非常に理解しにくいことのひとつが、いわゆるURL周辺です。これはWordPressが静的なサイトではなく、動的なサイトだからです。


たとえば一般的な静的サイト、つまりHTMLでつくったサイトの場合は、サーバーのなかに作成したファイルが実在しています。

https://mysite.co.jp/index.html

というURLだった場合、サーバーのルートディレクトリのなかに、必ず「index.html」があるということです。


いっぽうWordPressの場合は、こうした「実在するURL」というのが基本的にはありません。たとえばWordPressをインストールすると、初期状態では「Hello world!」という投稿があって、そのURLは「https://mysite.co.jp/hello-world」となっているはずです。

ところが、ルートディレクトリをいくら探してみても、「hello-world」というファイルはありません。あるのは「wp-admin」「wp-content」「wp-includes」という三つのディレクトリ(フォルダ)と、「wp-*.php」や「license.txt」、さらには「readme.html」というファイル。そして最後に残るのが、「.htaccess」と「index.php」です。


この「index.php」というのが、ほんとうに大切なファイルです。WordPressのURLは、そのすべてが「.htaccess」によって、最終的には「index.php」に転送されるようにできているからです。

先ほどの「Hello world!」の話に戻りますが、WordPressで記事を書くと、そのURL(WordPress用語でスラッグ)も自由に決められます。「Hello world!」というタイトルの記事を書いて、そのURLを「hello-world」にするような感じです。

とはいえ、この「hello-world」というファイルはルートディレクトリ内には存在しないため、そもそもの話として、このままでは表示できない(404エラーを吐く)はずです。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php [L]

ここで必要になるのが、WordPressに最初から入っている「.htaccess」です。とりわけ後半の三行で、もしドキュメントルート内にディレクトリやファイルが存在しなかったら、つまり「hello-world」などといったファイルがなかったら、すべて「index.php」に転送しなさいと指定しています。

ここのドットが少し難しいかもしれませんが、これは(.*)みたいに書くとわかりやすいです。「ゼロ文字以上のすべての文字を」という意味になるので、どんなURLでも「index.php」に飛ばしているわけです。

そしてさらに、転送された「index.php」の側で、WordPressが疑似的にURLを書き換えていきます。ここまで複雑な手順をへることで、本来は存在しないはずの「https://mysite.co.jp/hello-world」というURLを、ほぼ自動的に表示しています。

なお、[R=301,L]だと「https://mysite.co.jp/index.php」に転送されますが、ただの[L]なので転送までは行きません。あくまでも「https://mysite.co.jp/hello-world」というURLのままで、記事を表示しようとします。そのため、「https://mysite.co.jp/dgfdhgfghfdh」と入力してもURLは変わりませんし、そうしたスラッグの記事がWordPress内になければ、ふつうに404エラーを吐きます。


こうした仕組みは今でこそ理解できるようになりましたが、おっしゃるように、そもそもWordPressのURLを解説した本やネット記事が少なすぎるように思います。思い返せるだけでも、かなりの失敗を重ねました。ただ設定を丸写しさせるようなものではなく、ちゃんと仕組みから説明してくれるような本があれば、ここまでの遠回りはしなかったかもしれません。

内容的には少し古くなってきましたが、下記の本はURLの仕組みからしっかりと解説していて、個人的には「救われた一冊」のひとつです。

参考URL:https://book.mynavi.jp/ec/products/detail/id=22613

投稿日時 - 2019-05-25 15:57:08

補足

お礼コメントをもう一つご回答いただいた方のお礼と間違えて投稿してしまいました^^;
ひとつお聞きしたいのですが、.htaccessには実際に(.*)ではなく.とあります。
ドットは任意の一文字ですが、(.*)は任意の一文字以上ということでしょうか?全く違う意味に見えるのですが、もう少し補足いただければ幸いです。

投稿日時 - 2019-05-26 19:27:45

お礼

ご回答ありがとうございます。
例えばmysite.co.jp/wp-adminで管理画面にアクセスできて、mysite.co.jp/random_stringだとリダイレクトされるというのはhtaccessでの記述によるものだったんですね。

404については記事の部分だけ404になるのがカッコ悪いので404ページにリダイレクトしたいと思いましたが、のちの課題とします。

htaccessでのリダイレクト先はさくらサーバーで設定した独自ドメインと考えればいいということですかね。
さくらサーバーでの設定、ワードプレスの一般設定、.htaccessなどでだいぶ混乱しましたが、素人ながらOSI参照モデルを考えてみたら少し理解できた気がします。
ありがとうございました。

投稿日時 - 2019-05-26 19:10:38

あなたにオススメの質問