skillup

技術ブログ

サーバー・ネットワーク

URLのリライトに関して

投稿日:2019年8月29日 更新日:

laravelのアプリをサブディレクトリ(notサブドメイン)に配置しなくてはならないケースがあり、.htaccessと格闘したのでメモを。

このパターンはハマりが多いですね・・・

http://skill-up-engineering.com/tag/rewrite/

といっても個別のアプリのケースを書いてもあまり意味はないので、対応方法について記して置こうかと思います。

基本はRewriteCondとRewriteRule

基本的にはリダイレクトのパターンはRewriteCond(このパターンだったら)とRewriteRule(このように書き換える)になるかと思います。

ただしRewriteCondは複数書くことができます。

うまく切り替わらない時は要は

  1. RewriteCondが効いていない(条件の正規表現が違うなど)
  2. 適切なRewriteRuleが効いていない

のいずれかになります。修正時のポイントですが、1、2を切り離して調査するようにしましょう。

お勧めとして、1が正確に動いているかどうかを見るには

上記のように書いて見ましょう。

この場合、yahooに飛べば、RerwriteCondが動いているかどうかがはっきりとわかります。

RewriteBase

特にサブディレクトリのURLの書き換えとなりますと、

のようなケースが発生します。

この場合、hogeのところまでが書き換え不要ですので、

のように書いておくと、hoge以降がパターンマッチングやリライトの対象になります。

L,Rなどのフラグに注意

RewriteRuleでURL自体は意図した動きをしているのに、

  • 永久ループが発生している
  • ブラウザのURLを変えたくないのに変わってしまう

など動きが微妙に異なっている場合があります。

この場合、

RewriteRuleの後についているフラグが大切になってきます。

代表的なものは

L・・lastの意味。ここでURLの書き換えをストップ

R=301・・301リダイレクト ページの移転や通常の書き換え

R=302・・302リダイレクト メンテ画面やエラー画面など

*基本的にリダイレクトをするとブラウザのURLが変わります。

【mod_rewrite】フラグ

リライトは複数回行われていることを疑う

リライトが意図しない動きをしている場合、複数回のリライトがされていることが一般的です。

その場合、LフラグやENDフラグをつけるなどして、処理をストップさせるようにしましょう。

プログラムとリソース系のファイルの扱いの違いに注意

ある程度の規模のアプリになるとプログラム(例えばPHP)とリソース系のファイル(css,js,画像)などは分岐されていることが一般的です。

プログラムの場合、ルーティングなどが設定されていることが多いので、特定のファイルに飛ばすにことが一般的です。(大抵はルートディレクトのindex.php)

逆にリソース系のファイルは直でURL通りにアクセすることが一般的ですので、URLのルールが違うことが多いです。

階層の優先度に注意

ある階層でhtaccessをかくとその下全てに影響します。

ですので、影響度をコントールしたい場合、階層などをうまく切り分けるようにしましょう。

デバッグ

デバッグのポイント(ログ出しやキャッシュの消去など)は下記リンクなどを。

mod_rewriteでの注意点

-サーバー・ネットワーク
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

scpコマンドを使ったサーバー間のファイルのやり取り

あるサーバーのファイルを別サーバーにコピーするとき、大昔はFTPを使っていましたが、現在FTPサーバー自体を立てることがあまりないため、SSHを使ったSCPコマンドでのファイル点を使いました。 Con …

no image

nginx基本

データベースについて勉強していましたが、実務でnginxを触る機会があったので、これを機に勉強。 Contents1 参考文献2 nginx基礎3 コアモジュール4 httpモジュール5 設定ファイル …

no image

HTTPヘッダ・インジェクション+オープンリダイレクタ

Contents1 HTTPヘッダ・インジェクションとは?1.1 被害(ほぼクロスサイト・スクリプティング攻撃による脅威と同じ脅威)1.2 対策2 オープンリダイレクタとは?2.1 対策 HTTPヘッ …

no image

mod_rewriteについて

本日はapacheのmod_rewriteについて。 例えばget句に郵便番号を付けて、住所を出力するWEBプログラムがあるとします。 この場合、そのままだと[crayon-5f36bb8469750 …

no image

jenkinsのオートデプロイ

久々にJavaやりました。 Contents1 やりたいこと2 ハマりポイント2.1 Antでのjobの設定2.2 jenkinsでビルドできない2.3 jenkinsのオートデプロイ2.4 SSHで …