質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • .htaccess

    384questions

    Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

sakuraサーバー RewriteRule がうまく動作しない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,059

imamura

score 123

.htaccessの設定で下記のように変換をしています。

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
Order deny,allow

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

example.com/login → example.com/login.php(アクセスしたいURL)
example.com/login → /home/username/www/login.php(アクセスしたいファイル)
結果は「not found」となってしまいます。

※example.com/login.php にアクセスすると問題なく表示されます。

いろいろ調べて、下記のようにすると動作することがわかりました。
転送先のファイル名を変更するという方法です。

RewriteRule ^([^\.]+)$ $1_file.php [NC,L]
example.com/login → /username/www/login_file.php

同様の症状に出くわした人がいました。
http://nymemo.com/sakura/1371/

他のレンタルサーバーも使っていますが、sakuraだけこのような動作になります。
そこでサポートに確認をしたところ無回答の返事が来ました。

大変申し訳ございませんが .htaccess の内容等、お客様にて用意
されたコンテンツにつきましては弊社ではサポートを行うことは
出来ません。ご了承くださいますようお願いいたします。

なお RewriteRule に対する弊社独自の設定等は行っておりません。

また他のお客様より同様のお問い合わせは確認できておりません。

同様の問い合わせはないかもしれませんが、同じ症状のリンクは伝えたんですけど…。

sakuraのサポートが言われるように「独自の設定をしていない」という場合、
何が原因でこのような状況になっているのでしょうか?

最後の一行を次のように変更してテストしました。

RewriteRule ^test$ login.php [NC,L]


example.com/test にアクセスをすると「500エラー」が発生しました。

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

サーバーのエラーログには次の情報が残っていました。

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

[追記]
テストで一番下の行を次のよう変更してみました。

RewriteRule ^([^\.]+)$ https://www.google.co.jp/?redirect=$1.php [NC,L]


$1がどのような結果で返ってきているのか確認をするのが目的です。
その結果、
転送後にファイルが存在する場合は「NotFound」
転送後にファイルが存在しない場合はGoogleに転送されました。

example.com/login (login.php有り) → NotFound
example.com/dummy (dummy.php無し) → https://www.google.co.jp/?redirect=dummy.php 

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2017/03/09 10:30

    私もよくわかっていません。つまり、ftp://example.com/username/www/login.php に PHP ファイルを置いた。これは何もしなければ http://example.com/login.php でアクセスできるものだが、http://example.com/login でアクセスしたい。こういうことですか?

    キャンセル

  • imamura

    2017/03/09 10:33 編集

    はいそうです。直接 login.php と指定すると問題なく表示されます。

    キャンセル

  • otn

    2017/03/09 10:45

    ああ、入れ違いで書かれてましたね。

    キャンセル

回答 3

check解決した方法

+1

解決しました。
.htaccessに下記コードを追加しました。

Options -MultiViews

調べていくうちにAapcheのMultiViewsが怪しいと思い、昨日さくらに問い合わせをしていました。

少し前に返事が届き「MultiViewsは有効になっている」ということが確認できました。
もしやと思い、login.htmlのダミーファイルをアップロードして example.com/login にアクセスをすると example.com/login.html の内容が表示されました。

.htaccessで処理される前に移動していたものと思われます。
MultiViewsは条件によって自動的に処理されるようで…
似たファイル名があると処理する、無ければ処理しないようになっているようです。

/login に似た login.php があるので login.html へ
/test に似たファイルはないので .htaccess に渡されて処理された。

というのがこれまでの流れのようです。(意味不明な条件ですが…)

MultiViewsは.htaccessのOptions設定でoffにできるようなのですが、さくらレンタルサーバーはOptionsが設定できないようになっていました。
ところが、偶然にも本日さくらサーバーから「.htaccess でのOptions設定可能化」というメールが届きました。

お客様より多くのご要望をいただいておりました、.htaccess での
Options設定ができるようになりました。
Options では、All,FollowSymLinks 以外の機能が設定可能です。

というわけで、上記のコードを追加したところ目的通りの動作をすることが確認できました。

アドバイスありがとうございました。
やり取りのお陰で解決へのヒントを得ることができました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

これでできそうな気もしますがどうでしょうか?

<Files ~ "^\.(htaccess|htpasswd)$">
Order deny,allow
deny from all
</Files>

RewriteEngine On
RewriteRule ^/login$ /login.php [L]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/09 19:41

    ご提供頂いたコードをまるごと.htaccessに設定してみました。
    結果は次のとおりです。
    example.com/login → 404 NotFound
    example.com/login/ → 404 NotFound
    ※googleへの転送はチェック用です。

    example.com/login.php では表示されます。

    よろしくお願いします。

    キャンセル

0

対症療法としては、RewriteCondの行を削ればいけそうな気がします。
存在するファイルはすべて拡張子ありという場合は、RewriteRuleでピリオドを含む場合は除外されるので大丈夫。

一応、404になる可能性としてありえるのが(当てはまって無い気がしますが)、
/home/username/www/loginというディレクトリがあるケースです。

この場合、http://example.com/loginは、http://example.com/login/にリダイレクトされて、さらにhttp://example.com/login/.phpにリライトされ、/home/username/www/login/.phpが無いため、404になる。

ただし、この場合はブラウザのアドレスバーがhttp://example.com/login/に変わるので気づくはず。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/09 19:39

    回答ありがとうございます。次のようなテスト結果となりました。
    【削除】 RewriteCond %{REQUEST_FILENAME} !-f

    example.com/login → 404 NotFound
    example.com/login/ → 404 NotFound
    example.com/test → https://www.google.co.jp/?redirect=test.php
    example.com/test/ → https://www.google.co.jp/?redirect=test/.php
    ※googleへの転送はチェック用です。

    loginというフォルダは現在のフォルダ、上位フォルダ内にもありません。
    よろしくお願いします。

    キャンセル

  • 2017/03/09 19:42

    example.com/login.php では問題なく表示されます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • .htaccess

    384questions

    Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。