cakePHP3でconfにrewriteの設定を記載したのに
効かなくて困った
今回で最終です。。
なんだかんだこの関連で3回も記事を書いてしまいました
前回まではこのタイトルに至るまでの経緯と行った作業をつらつらと書いてきたのですが
ここで問題が発生しました
それは、virtualhost.confに記載したこの部分です
RewriteCond %{REQUEST_URI} !^/img/${project}
RewriteRule ^img/(.*)$ img/${project}/$1 [L]
これの意図は、イメージはそれぞれの管理者(企業)のイメージになるため既存仕様ではイメージディレクトリは複数に対応していないので意図する管理者(企業)の画像が登録されなかったり、意図しない画像が上書きされてしまったりいてしまいます
ですので管理画面はそれぞれのproject_codeのディレクトリ階層に登録されるように変更しました
さて登録は問題なくなりましたが、参照にも手をいらなくてはいけないわけです
このサービスは、android/iOSのアプリを利用するサービスで、こちらも管理者(企業)ごとに作成されます。しかし、画像のパスも管理者(企業)が増えるたびに内部の画像パスも変更しなければならないことになり、アプリの初期コストに少なからずなります
さらにはそれぞれの記載をしていればミスも産まないわけではわりません
そこで、virtualhost.confに先ほどの記載をして元々のイメージパスにアクセスしてきたら、アクセスドメインで画像のパスをイメージパスの下に作成したプロジェクトコードの下に置かれた画像を参照するようにしようとしたわけです
しかしここで意図しない挙動になりました
apacheを再起動してアクセスすると、project_codeでURLは書き換えられてアクセスしますが、さらにまた書き換えてを繰り返してしまうのです
アクセスログを確認するとこんな感じです
https://domain.com/project_code/img/top.jpg
https://domain.com/project_code/project_code/img/top.jp
https://domain.com/project_code/project_code/project_code/img/top.jpg
・・・・
こんな感じです。。。
はじめはなんだ??っと困惑しましたが
まさか!?
と思って一つ試しました
それは、cakePHP3にある.htaccessのrewriteをコメントしてvirtualhost.confに移してみること
そうするとうまくいきました
よくよく考えると納得です
virtualhost.confに書かれた記述でimgのアクセスはプロジェクトコード付きでアクセスされますが、今度は.htaccessに書かれた記述が影響します
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
この記載ですね
上は先頭から始まり末尾なのでドメインでアクセスした場合はwebroot/に流して
下は任意の一文字に0回以上マッチしたらwebroot/{ドメインの後ろ}で流す
ということで、挙動を考えてみると
まずはvirtualhost.confでアクセスしてきたURLをrewiriteします
https://domain.com/project_code/img/top.jpg
になります
しかし今度は.htaccessに記載された
RewriteRule (.*) webroot/$1 [L]
これの書き換えが行われるんですよね
挙動をみるとどうやら.htaccessの書き換えの後に再びvirtualhost.confの書き換え条件をチェックするみたいですね
そうするとvirtualhost.confのルールですから
https://domain.com/project_code/project_code/img/top.jp
こちらで書き換えされて、.htaccessのルールで書き換えされる・・・
これの繰り返しです
そうやら.htaccessのRewriteRuleでマッチしてもどうやらまた最初から条件をみてしまうみたいですね
こちらの記事は後から見つけました。。。
vhosts.conf に書いた mod_rewrite が効かなくて泥沼にはまる
私がした対応は以下です
>> RewriteEngine on
>> RewriteCond %{REQUEST_URI} !^/img/${project}
>> RewriteRule ^img/(.*)$ img/${project}/$1 [L]
>> RewriteRule ^$ webroot/ [L]
>> RewriteRule (.*) webroot/$1 [L]
>> SetEnv PROJECT_CODE ${project}
と.htaccessに記載されていたものをvirtualhost.confに移しました
.htaccessにRewriteCondを記載するという方法もあるらしいのですが、${project} こちらが取得できないので判別できずに諦めました。。。
ということでこちらの件は解決して以上になります
前回まではこちら!
cakePHP3の.htaccessでrewriteできなくてはまる。。。①
cakePHP3の.htaccessでrewriteできなくてはまる。。。②
=====ちなみに
後からですがこちらの記事が一番対応が綺麗かと思いました
rewriteのこともわかりやすく書いてありました
.htaccess に RewriteRule 書くときは、[L]フラグをつけてもそこで終了しないかもよ?って話。
ENDフラグをつければ良いかもしれません
今度試してみよう!!
コメント
コメントを投稿