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

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

ただいまの
回答率

89.52%

form の action 時の振る舞いが異なる理由について

受付中

回答 2

投稿 編集

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

sakamata

score 141

XPMPP環境とCentOS6環境で、formからactionをさせた際のアプリの振る舞いが異なるのですが、その原因が掴めず困っています。

XAMPP環境(windows10)
Apache2.4.10(win32)
php5.6.3
MySQL 5.6.21

CentOS6.8(Final) 環境(webサーバー)
Apache2.4.23
php 5.6.36
MySQL 5.6.33

パーフェクトPHPのサンプルフレームワークを元にアプリを構築しました。

リクエストは index.php で受け取り、クライアント側のURLでは基本では http://hoge/app/index.php 以降のpathを受け取って処理をしています。

例えばログインでは以下のURL
https://localhost/hoge/app/index.php/account/signin

この最後の account/signin でリクエストを受け取り処理をしています。

htmlのformはこうなっています。

<form action="/hoge/app/index.php/**account/authenticate**" method="post" accept-charset="utf-8">

投げられたリクエストは authenticate で認証処理を行い、ログイン後のページにリダイレクトや、元のページにエラーを出力する等の処理をしています。

XAMPP環境では正常に動作をしてログイン処理がされますが、CentOS環境では動作が異なり、画面遷移が行われずURLにリクエスト先の
https://localhost/xxx/app/index.php/account/authenticate
が表示されるのみです。
この原因が掴めず難儀しています。

一応、以下の要因については調査をして、私の把握する範囲で、設定に関連する場所を以下に記述します。

phpファイルのソース(Git管理の為完全一致なので現状の要因から除外)

.htaccess(XAMPP,CentOS 共通)
/xxx/app/.htaccess に配置

<IfModule mod_rewrite.c>
    DirectoryIndex index.html index.cgi index.php .ht
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

怪しいと思っているのが、 httpd.conf ですが、こんな構成です。
設定に絡むと思われる部分のみ抜粋します。(cgiはいずれも設定無し)

XAMPP

<Directory />
    AllowOverride none
    Require all denied
</Directory>
<Directory "C:/xampp/htdocs">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>


CentOS側

<Directory "/var/www/html">
  Options FollowSymLinks Includes
  AllowOverride All
</Directory>
<VirtualHost *:80>
  ServerAdmin root@XXX.org
  DocumentRoot /var/www/html
  DirectoryIndex index.php index.php
  ServerName www.XXX.org
  ServerAlias xxx.org
</VirtualHost>
<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/xxx.org/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/xxx.org/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/xxx.org/chain.pem
  ServerAdmin root@xxx.org
  DocumentRoot /var/www/html
  DirectoryIndex index.php index.php
  ServerName www.xxx.org
  ServerAlias xxx.org
</VirtualHost>

SSL対応の関係でCentOS側をVirtualhostにしています。
個人的にはこの辺が怪しいのかと思っていますが、基本設定とこちらの絡みでどう動作するかが、把握しきれていません。
また、公開フォルダ(/var/www/html)には別のindex.php があり、通常のウェブサイトを構築しています。ここには.htaccess等は置いていません。

こちらの現象の要因や記述等で原因に心当たりのある方、
これ以外の設定箇所等含めご指摘をお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

index.phpのソースがあると原因を特定しやすくなると思います。
お話を伺う限りRewriteかRedirectあたりのモジュールがらみだと思いますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/30 00:43

    回答ありがとうございます。index.phpですが、フレームワークを起動させる為の事柄のみ記述しています。

    index.php
    -----
    <?php
    require '../bootstrap.php';
    require '../xxxApplication.php';

    $app = new HappyApplication(false);
    $app->run();
    -----

    リクエストはまずすべてこのファイルで読み取り、index.php以降のURLを読み取って、ページ毎の処理をしています。

    そしてフレームワークのRedirect関連のモジュールですが、以下の様になっています。
    -----Controller.php 一部抜粋

    protected function redirect($url)
    {
    if (!preg_match('#https?://#', $url)) {
    $protocol = $this->request->isSsl() ? 'https://&#039; : 'http://&#039;;
    $host = $this->request->getHost();
    $base_url = $this->request->getBaseUrl();

    $url = $protocol . $host . $base_url . $url;
    }

    $this->response->setStatusCode(302, 'Found');
    $this->response->setHttpHeader('Location', $url);

    }

    public function getHost()
    {
    if (!empty($_SERVER['HTTP_HOST'])) {
    return $_SERVER['HTTP_HOST'];
    }
    return $_SERVER['SERVER_NAME'];
    }

    public function getBaseUrl()
    {
    $script_name = $_SERVER['SCRIPT_NAME'];

    $request_uri = $this->getRequestUri();

    if (0 === strpos($request_uri, $script_name)) {
    return $script_name;
    } else if (0 === strpos($request_uri, dirname($script_name))) {
    return rtrim(dirname($script_name), '/');
    }

    return '';
    }

    -----
    各環境で出力したphpinfoを見ると、SERVER_NAME,HTTP_HOSTはいずれも、XAMPPは’localhost’ , CentOSは'xxx.org'です。
    SCRIPT_NAME も確認しましたが、いずれの環境でも同じものが吐かれます。

    以下、ログイン処理部分、Redirect処理を書いてます。
    ------

    public function authenticateAction()
    {
    if ($this->session->isAuthenticated()) {
    return $this->redirect('/account');
    }

    if (!$this->request->isPost()) {
    $this->forward404();
    }

    $token = $this->request->getPost('_token');
    if (!$this->checkCsrfToken('account/signin', $token)) {
    return $this->redirect('/account/signin');
    }

    --中略-- 認証に問題が無ければ以下の処理をする

    $this->session->setAuthenticated(true);
    $this->session->set('user', $user);
    return $this->redirect('/');
    }
    }

    return $this->render(array(
    'usId' => $usId,
    'usPs' => $usPs,
    'errors' => $errors,
    '_token' => $this->generateCsrfToken('account/signin'),
    ), 'signin');
    }

    環境変数かなぁという気もしてるんですが、関連するcodeの値で環境毎に違っている箇所も見つけられずなんです。どうしたものか。

    キャンセル

  • 2016/10/01 00:56

    Rewrite関連な気がしますね。
    CentOSにあるプログラムのうち、どこまで処理が進んだかを確認するのが一番近道に思います。
    errro_log()するなどでURLパラメータで渡された値やローカル変数の内容を確認し、XAMPP側とどの値が異なるのかを確かめるのが良いのではないでしょうか。

    キャンセル

0

.htaccessは共通で、XAMPPの場合はhttpのみ、CentOSの場合は http / https両方受けている状態でしょうか。
また、CentOS側では、httpでリクエストを受けたらhttpで返す(httpsには渡さない)、httpsで受けたらhttpsで返すことを想定されていますでしょうか。
それとも、http/httpsどちらで受けても、httpsで返す想定でしょうか。

httpsでのリダイレクトの場合は、とくに明示的に https をつけてあげる必要があったかもと思っています。
RewriteCond の条件指定で調整してあげるといいのではないかと思います。
うまく動作していなかったら、apacheのログ側も参照してみてください。

<IfModule mod_rewrite.c>
    DirectoryIndex index.html index.cgi index.php .ht
    RewriteEngine On

    # httpsにリダイレクトさせる場合は、明示的に $https://.... と指定する必要があるかも
    RewriteCond %{HTTPS} on            # httpsで受けてる場合
    RewriteCond %{HTTP_HOST} xxx.org   # かつ、XAMPP(localhost)でなく xxx.orgで受けたら
    # https にリダイレクト
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

   # そのあとは共通
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>


的外れでしたら申し訳ありません...

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/30 14:44

    回答ありがとうございます。

    >.htaccessは共通で、XAMPPの場合はhttpのみ、CentOSの場合は http / https両方受けている状態でしょうか。

    その通りです。

    >また、CentOS側では、httpでリクエストを受けたらhttpで返す(httpsには渡さない)、httpsで受けたらhttpsで返すことを想定されていますでしょうか。
    >それとも、http/httpsどちらで受けても、httpsで返す想定でしょうか。

    どちらでも受けられる状態で、記述していただいた様な処理をしていません。
    また設計としてはログインやサインイン時のみhttpsへリダイレクトさせて、その他、ログイン後は http へリダイレクトされる処理を htmlのヘッダー部分でJavaScriptで記述しています。

    http なら https への場合
    if (document.location.protocol==="http:")
    {location.replace('https://&#039;+window.location.host+window.location.pathname);}


    これが原因かとも思ったのですが、実は form の action="" の値に
     index.php を抜いたpathでactionを投げた場合は。XAMPPもCentOSも問題なくログイン処理がされるのです。
    つまりこういうことです。

    CentOSのみ通らない
    <form action="/hoge/app/index.php/account/authenticate" method="post" accept-charset="utf-8">

    XAMPP,CentOS,両方通る
    <form action="/hoge/app/account/authenticate" method="post" accept-charset="utf-8">


    となると、ご指摘いただいた件とはまた別の問題の様な気がしております。なんなんでしょう。
    ただ、httpsへのリダイレクト設定に関しては、把握してない事柄でしたので、とても参考になりました、ありがとうございます。またApacheのログも参考にしてみます。

    キャンセル

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

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

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