ご存じのようにWordPress導入で、.htaccessファイルに以下のような記述が追加されます。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule># END WordPress
- RewriteRule ^index\.php$ – [L]
/index.phpの場合、この行で終了する命令です
- REQUEST_FILENAMEは、apacheサーバー側で認識したフルパスのファイルです。
The full local filesystem path to the file or script matching the request, if this has already been determined by the server at the time REQUEST_FILENAME is referenced.
mod_rewrite - RewriteCond %{REQUEST_FILENAME} !-f
REQUEST_FILENAMEがファイルだった場合、ここで終了します。
- RewriteCond %{REQUEST_FILENAME} !-d
REQUEST_FILENAMEがディレクトリだった場合、ここで終了します。
- RewriteRule . /index.php [L]
実際のファイルがない、ディレクトリがない、この条件を満たした場合、index.php(WordPress本体)を呼び出し、終了します
- WordPressで追加された.htaccessの記述の意味、なんとなくわかった感じですよね。
apacheが判断して格納するREQUEST_FILENAMEはそういう処理だったんですね
WordPressをインストールした/直下には、index.phpのほか、readme.htmlがあるかと思います。
- /index.php
- /readme.html
https://あなたのドメイン/readme/
でアクセスしてみてください。readme.htmlが表示されます。
a.htmlやb.txtを配置しても同様です。
https://あなたのドメイン/a/→a.htmlが表示される。
https://あなたのドメイン/b/→b.txtが表示される。
c.phpは「要求された URL はこのサーバーで見つかりませんでした。」とエラーになります。
https://あなたのドメイン/c/
https://あなたのドメイン/a/→a.htmlが表示される
REQUEST_URIはaのはずですよね。REQUEST_FILENAMEはaでファイルなしかと思いきやa.htmlが見つかるってことです。
つまり、/a/は、a.html、a.txtを探し、ファイルが存在した場合、REQUEST_FILENAMEに設定されてしまうってことです。
apacheの挙動なので、ユーザーサイドで何かするのは難しいと思います。
まとめ:多分バグかも、見方を変えると何か裏技的な方法に?
nginxを利用したサーバーでは、https://あなたのドメイン/readme/にアクセスしても、wordpressの404ページに遷移してくれます。さくら側の挙動はapacheの不具合だと思われます。
WordPress内で設定するアーカイブやタグ、カテゴリと一致してしまうファイルを置いてしまうと誤動作するってことになると思います(試していません)。要注意ですね。
見方を変えると、これは.htmlを隠してアクセスするちょっとイケてる?公開方法に活用できるかもしれませんね。(不具合が修正された場合、404ページに遷移してしまうリスクあり)
コメント