Blog

【symfony2】デフォルト.htaccessファイルの改修

symfony2のデフォルトとして、リクエストのファイル(REQUEST_FILENAME、実際の値は、例えば/var/www/html/index.htmlになります。それに対して、REQUEST_URIの値は/index.htmlになります)が存在しなければ、パラメーターをapp.phpを渡して処理するという.htaccessの設定があります。

※RewriteCond = rewrite condition = リライトの条件
※RewriteRule = rewrite rule = リライトのルール。合わせて、リライトの条件を満足すれば、リライトのルールのようにurlを変換するという意味です。

問題点

実際存在するディレクターにアクセスしたい場合は、
例えばhttp://www.example.com/existed_directory/にアクセスすると、404になります。

なぜなら、existed_directoryはディレクターであり、ファイルではないなのです。
app.phpに処理を渡しますが、existed_directoryというroutingがないから、404が返してしまいます。

解決策

ここで、ちょっとsymfony2のデフォルトの.htaccessを改修したいと思います。

説明

複数のRewriteCondの間で[AND]で繋ぎます。
リクエストのファイルが存在しない、かつディレクターではない場合だけ、処理をapp.phpに渡すという意味になります。

上記の設定で、http://www.example.com/existed_directory/にアクセスしてみると、RewriteCondにマッチしないため、
existed_directoryのディレクターにしたのindex.html(存在しない場合はindex.php)にアクセスが行きます。

新たな問題点

実際存在するディレクターにアクセスできない問題が解決しましたが、http://www.example.com/にアクセスすると、処理がapp.phpに渡されていない(そのため、symfony2が処理を始めない)という新しい問題が発生します。
そのため、.htaccessをさらに改修する必要が出てきています。

解決策

説明

RewriteCondが複雑になってきますので、分解して説明いたします。
1、RewriteCond %{REQUEST_FILENAME} !-f リクエストのファイルが存在しない
2、RewriteCond %{REQUEST_FILENAME} !-d リクエストのファイルがディレクターではない
3、RewriteCond %{REQUEST_URI} ^/$ トップにアクセスしている

リライトの条件が、1 and ( 2 or 3) になります。

まとめ

apacheのRewriteCondが想像だけでややこしくて間違いやすいので、実際に試してみればよいかと思います。

Author Profile

jeff_maj

システムエンジニア/1984年生/上海交通大学卒/Webサービス/EC/iphone/android

» 投稿一覧
  • Launch Cart次世代ECサイト構築システム 初期月額無料
  • LaunchMovie ECに特化した動画制作サービス

Archive

ページTOPへ