dポイントプレゼントキャンペーン実施中!

CakePHPではURLを一度index.phpにリダイレクトするような作りになっていますが、Googleの検索エンジン用のsitemap.xmlファイルを公開ディレクトリに置いた場合、そのファイルだけはmod_rewriteのルールから外して、普通にブラウザで見れる状態にしたいです。
.htaccessをどのように設定すれば良いか、教えてください。
なお、CakePHPのindex.phpファイルと.htaccess、sitemap.xmlは同じディレクトリに置いてあります。

[環境]CakePHP 1.3 PHP5.3

現在は.htaccessは以下のように設定されています。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

上記の
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
の前の行に
RewriteCond %{REQUEST_FILENAME} ^sitemap.xml
を入れるとこのファイル自体はブラウザから見れるようになりますが、サイトのトップページ以外を見ようとすると、「Not Found」が返ってきてしまいます。

A 回答 (1件)

どこも直す必要はありません。

もとの.htaccessに戻してください。

RewriteCond %{REQUEST_FILENAME} !-f

.htaccess のこの行で、同一ディレクトリー内に存在するファイルとブラウザなどからのリクエストパスがマッチすれば、次行のRewriteRuleは適用されず、そのファイルにapacheが直接アクセスします。ディレクトリーについても !-dの行があるので、存在しているjs や css ディレクトリー内のファイルも同様にcakePHPは経由せず、直接実在ファイルにapacheがアクセスします。
実在ファイル名パスをブラウザurl欄にいれて、もし、cakePHPのcontrollerが無いなどというエラーが出るようなら、ファイル名かディレクトリー名に間違いがあります。
あとは、apacheが読み込み出来るようにパーミッションを設定してください。通常604とします。

ちなみに、以下の設定は、 sitemap.xml というリクエストの時だけ、次行のRewriteRuleを適用するという意味になる。

RewriteCond %{REQUEST_FILENAME} ^sitemap.xml

実際には、!-fの行で既にsitemap.xmlは、はじかれて何も適用されずに表示しており、それ以外のcakePHP用のパス記述はここで全部弾かれる
    • good
    • 0
この回答へのお礼

mpro-gramさん

ご回答ありがとうございます。
RewriteCond %{REQUEST_FILENAME}
の意味が理解できました。

「ファイルやディレクトリが実在しない場合は、CakePHPのRewriteRuleを適応」
「ファイルやディレクトリが実在する場合はそのまま表示」
ということだったんですね。

「もともとCakePHPのinidex.php以外は塞がれている」と勘違いしていました。
よくよく考えてみると、そのような記述はないですよね。

お礼日時:2014/01/20 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!