【symfony2】デフォルト.htaccessファイルの改修
symfony2のデフォルトとして、リクエストのファイル(REQUEST_FILENAME、実際の値は、例えば/var/www/html/index.htmlになります。それに対して、REQUEST_URIの値は/index.htmlになります)が存在しなければ、パラメーターをapp.phpを渡して処理するという.htaccessの設定があります。
1 2 3 4 5 | <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ app.php [QSA,L] </IfModule> |
※RewriteCond = rewrite condition = リライトの条件
※RewriteRule = rewrite rule = リライトのルール。合わせて、リライトの条件を満足すれば、リライトのルールのようにurlを変換するという意味です。
問題点
実際存在するディレクターにアクセスしたい場合は、
例えばhttp://www.example.com/existed_directory/にアクセスすると、404になります。
なぜなら、existed_directoryはディレクターであり、ファイルではないなのです。
app.phpに処理を渡しますが、existed_directoryというroutingがないから、404が返してしまいます。
解決策
ここで、ちょっとsymfony2のデフォルトの.htaccessを改修したいと思います。
1 2 3 4 5 6 | <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ app.php [QSA,L] </IfModule> |
説明
複数の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をさらに改修する必要が出てきています。
解決策
1 2 3 4 5 6 7 | <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d [OR] RewriteCond %{REQUEST_URI} ^/$ RewriteRule ^(.*)$ app.php [QSA,L] </IfModule> |
説明
RewriteCondが複雑になってきますので、分解して説明いたします。
1、RewriteCond %{REQUEST_FILENAME} !-f リクエストのファイルが存在しない
2、RewriteCond %{REQUEST_FILENAME} !-d リクエストのファイルがディレクターではない
3、RewriteCond %{REQUEST_URI} ^/$ トップにアクセスしている
リライトの条件が、1 and ( 2 or 3) になります。
まとめ
apacheのRewriteCondが想像だけでややこしくて間違いやすいので、実際に試してみればよいかと思います。
Author Profile
スターフィールド編集部
SHARE