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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

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

Q&A

2回答

2612閲覧

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

sakamata

総合スコア203

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

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

0グッド

0クリップ

投稿2016/09/29 12:27

編集2016/09/29 12:31

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はこうなっています。

html

1<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

httpd.conf

1<Directory /> 2 AllowOverride none 3 Require all denied 4</Directory> 5<Directory "C:/xampp/htdocs"> 6 Options Indexes FollowSymLinks Includes ExecCGI 7 AllowOverride All 8 Require all granted 9</Directory>

CentOS側

httpd.conf

1<Directory "/var/www/html"> 2 Options FollowSymLinks Includes 3 AllowOverride All 4</Directory> 5<VirtualHost *:80> 6 ServerAdmin root@XXX.org 7 DocumentRoot /var/www/html 8 DirectoryIndex index.php index.php 9 ServerName www.XXX.org 10 ServerAlias xxx.org 11</VirtualHost> 12<VirtualHost *:443> 13 SSLEngine on 14 SSLCertificateFile /etc/letsencrypt/live/xxx.org/cert.pem 15 SSLCertificateKeyFile /etc/letsencrypt/live/xxx.org/privkey.pem 16 SSLCertificateChainFile /etc/letsencrypt/live/xxx.org/chain.pem 17 ServerAdmin root@xxx.org 18 DocumentRoot /var/www/html 19 DirectoryIndex index.php index.php 20 ServerName www.xxx.org 21 ServerAlias xxx.org 22</VirtualHost>

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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/29 21:23

suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakamata

2016/09/30 05: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://'+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のログも参考にしてみます。
guest

0

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

投稿2016/09/29 15:05

goute

総合スコア216

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakamata

2016/09/29 15: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://' : 'http://'; $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の値で環境毎に違っている箇所も見つけられずなんです。どうしたものか。
goute

2016/09/30 15:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問