MW211 EXIT

devlog
Apache/Apache2.4をIEで見るとレスポンスが悪い
2017年02月18日
【現象】
  Apache2.4でPHPを動作させているとたまにレスポンスが悪くなる。
【原因】
  IE(IE10/11)の場合、リクエストを投げるとそれに対するレスポンスはするが、
  それ以降のレスポンスが返らなくなる。
  Windows NT向けに最適化されたマルチプロセスモジュール(のバグ?)が原因。
【解決方法】
  原因を切ってしまう。
  Apache設定ファイル「extra/httpd-mpm.conf」の以下セクションに以下を追記する。
┌──────────────────────────────────────┐
│<IfModule mpm_winnt_module>                                                 │
│    AcceptFilter http none                                                  │
│    AcceptFilter https none                                                 │
│</IfModule>                                                                 │
└──────────────────────────────────────┘
  「httpd.conf」に追記してもいけるようだが
  マルチプロセッサモジュール(mpm)に起因する問題なので、こっちが適切か。
分類:Apache
Apache/PHPの設定
2016年12月02日
「httpd.conf」における以下の記述が肝。
┌──────────────────────────────────────┐
│LoadModule php5_module "C:\PHP\php5apache2_4.dll"                           │
│AddHandler application/x-httpd-php .php                                     │
│PHPIniDir "C:\PHP\"                                                         │
└──────────────────────────────────────┘
「C:\PHP\php5apache2_4.dll」と「C:\PHP\」は適宜変更のこと。

分類:PHP、Apache
PHP/PDOが効かなくなった
2014年10月26日
PHPのインストール時に、PostgreSQLのPDOをインストールしたのだが
何か拍子に(たぶん何かをインストールしたことによる影響と思われる)、
そのPDOが効かなくなった(「phpinfo()」で参照しても見えてこない)

再インストール(ChangeもしくはRepair)を行っても解消しない。
(インストール済みになる、一回削除してからやっても同じ)

で、Apacheのエラーログ「apache-error.log」を見たら以下のエラーが出ていた。
┌──────────────────────────────────────┐
│Warning:  PHP Startup: Unable to load dynamic library                       │
│ 'C:\Program Files (x86)\PHP\ext\php_pdo_pgsql.dll'                         │
│ - このオペレーティング システムでは %1 は実行されません。                  │
└──────────────────────────────────────┘

この解決方法は以下の通り。

Apacheの設定ファイル(httpd.conf)の末尾に、以下が自動で追加されるので
そこに以下の一行(★)を追加すれば解消された。
┌──────────────────────────────────────┐
│PHPIniDir "C:\Program Files (x86)\PHP\"                                     │
│Loadfile "C:\Program Files (x86)\PHP\libpq.dll"                 ←★これを追加
│LoadModule php5_module "C:\Program Files (x86)\PHP\php5apache2_2.dll"       │
└──────────────────────────────────────┘
「C:\Program Files (x86)\PHP」の部分はPHPのインストール先。

なんでだろう?
分類:PHP、Apache
HTTP/チャンク形式
2014年10月17日
応答HTTPヘッダにて以下の形式が選択される(併存は不可)
┌──────┬─────────────┬──────────┬──────┐
│内容長形式  │Content-Length    :xxxx   │全サイズがわかる    │            │
├──────┼─────────────┼──────────┼──────┤
│チャンク形式│Transfer-Encoding :chunked│全サイズがわからない│大容量向け  │
└──────┴─────────────┴──────────┴──────┘
分類:Apache
PHP/formの飛び先パスについての注意
2013年10月25日
formタグのactionパラメータに、飛び先のURLを指定する場合、
それがファイルではなく、ディレクトリであった場合には
しっかり末尾に「/」をつけてあげなければならない。
┌─┬────────────────────────────────────┐
│×│<form method="post" action="/abc">                                      │
├─┼────────────────────────────────────┤
│○│<form method="post" action="/abc/">                                     │
└─┴────────────────────────────────────┘

さもないと、「301転送」が発生してしまう。
┌─┬────────────────┬───────────────────┐
│×│… "POST /abc HTTP/1.1" 301 …  │301 Moved Permanently(転送)           │
├─┼────────────────┼───────────────────┤
│○│… "POST /abc/ HTTP/1.1" 200 … │200 OK(正常)                          │
└─┴────────────────┴───────────────────┘
(といっても、そうならないパスがあったりするから厄介だ)

「301転送」が起きるとどうなるのか?POSTの中身が消えてしまう(引き継がれない)

つまり、formタグの「/」がないだけで、いくらsubmitしても
受信側で$_POSTでデータを拾えないという怪奇現象が発生してしまうのだ。
(といっても、そうならないパスがあったりするから、ますます怪奇現象だ)
【後日追記あり】
分類:PHP、Apache
Apache/GET・POSTパラメータの追跡2
2013年10月24日
「multipart/form-data」の場合。

ログ上には以下のようなデータが出力されている。
┌──────────────────────────────────────┐
│… mod_dumpio.c(55): mod_dumpio:  dumpio_in (data-HEAP): xxx bytes          │
│… mod_dumpio.c(74): mod_dumpio:  dumpio_in (data-HEAP): -------------------│
│… mod_dumpio.c(142): mod_dumpio: dumpio_out                                │
└──────────────────────────────────────┘

「-------------------」の部分を解析する(改行コードを変換する)と
以下のような感じで、POSTデータがあらわれてくる。
┌──────────────────────────────────────┐
│-----------------------------xxxxxxxxxxxxx                                  │
│Content-Disposition: form-data; name="id"                                   │
│abc                                                                         │
│-----------------------------xxxxxxxxxxxxx                                  │
│Content-Disposition: form-data; name="name"                                 │
│xyz                                                                         │
│-----------------------------xxxxxxxxxxxxx                                  │
│--                                                                          │
└──────────────────────────────────────┘

境界線の定義とかも実はその前で出力されている。
┌──────────────────────────────────────┐
│… mod_dumpio.c(74): mod_dumpio:  dumpio_in (data-HEAP):                    │
│                       Content-Type: multipart/form-data;                   │
│                       boundary=---------------------------xxxxxxxxxxxxx\r\n│
└──────────────────────────────────────┘
分類:Apache
Apache/GET・POSTパラメータの追跡1
2013年10月23日
GETもしくはPOSTされたデータが本当にApacheでやりとりされているのか
トレースできるモジュールがApacheにはある。

「mod_dumpio」である。
既定では封印されているので(処理が重くなる?)、解き放ってあげねばならない。

「httpd.conf」を編集する。

以下のモジュールがコメントアウトされ封印されているので
先頭の「#」を除去して封印を解く。
┌──────────────────────────────────────┐
│LoadModule dumpio_module modules/mod_dumpio.so                              │
└──────────────────────────────────────┘

ついでに以下も記述(追加)する。
┌──────────────────────────────────────┐
│DumpIOInput On                                                              │
│DumpIOOutput On                                                             │
└──────────────────────────────────────┘
#これが正しい作法か疑問だが、上記「LoadModule」の次の行に追加したらOKだった。

ログレベルを「debug」にする。
┌──────────────────────────────────────┐
│#LogLevel warn                                                              │
│LogLevel debug                                                              │
└──────────────────────────────────────┘

これで設定完了。Apache再起動。

エラーログに、出力される。
#エラーログは以下のような感じで「httpd.conf」に設定されている
┌──────────────────────────────────────┐
│ErrorLog "logs/error.log"                                                   │
└──────────────────────────────────────┘

以下のような文言が出力されていれば設定成功。
┌──────────────────────────────────────┐
│… mod_dumpio.c(…): mod_dumpio: …                                         │
└──────────────────────────────────────┘
分類:Apache
Apache/「501 Not Implemented」エラー
2013年09月07日
「GET、POST、PUT、DELETE、CONNECT、HEAD、TRACE、PATCH、OPTIONS」以外の
メソッドを実行した場合。
もしくは、サーバ側にそれらのメソッドが実装されていない場合。
#大文字と小文字は区別される(小文字はエラーとなる)ので注意
分類:Apache
Apache/Basic認証
2013年05月11日
Basic認証を設定したディレクトリはログインダイアログで
ログインID(ユーザ名など)とパスワードを入力して照合されないと
そのファイルにアクセスできなくなる。

ログインダイアログとか定型のものが使えるので便利かも。

実態としては、Apacheの設定にて、特定ディレクトリのアクセスを拒否した上で
Basic認証で特別に許可にしてあげますよといった感じ。

以下に設定ファイル「.htaccess」を使った場合を記述する。

設定ファイル「.htaccess」を対象とするディレクトリ直下に置く。

設定ファイル「.htaccess」の内容
┌──────────────────────────────────────┐
│<Files ~ "^\.(htaccess|htpasswd)$">                                         │
│    deny from all               ←ログイン関係のファイル以外全てアクセス拒否│
│</Files>                                                                    │
│                                                                            │
│Order deny,allow                      ←基本「拒否」、でも例外的「許可」あり│
│AuthType Basic                        ←Basic認証ですよ                     │
│AuthUserFile C:/www/.htpasswd         ←パスワードファイルのファイルパス    │
│AuthName "Password Area"              ←ログインダイアログに表示される      │
│Require valid-user                                                          │
└──────────────────────────────────────┘

設定ファイル「.htaccess」で指定したパスワードファイルの場所に
パスワードファイルを置く(指定と一致すればよく、ファイル名は任意)。
#なお、相対パスにすると、Apacheの実行ファイルからの相対パスと
  なってしまうようなので、絶対パスの指定となる。

パスワードファイル(.htpasswd)の内容
┌──────────────────────────────────────┐
│user:pass                                    ←「ユーザID:パスワード」の形式│
└──────────────────────────────────────┘
とりあえずは平文のケースは上記の通り。

ある程度暗号化(符号化?)してセキュリティを高めることはできるようだが
それについてはおいおい。
分類:Apache
Apache/ディレクトリへのアクセス
2013年05月10日
特定の相手のみアクセスを許可したい場合(残りは全てアクセス拒否)。
┌──────────────────────────────────────┐
│<Directory ディレクトリ>                                                    │
│    Order deny,allow                                                        │
│    Deny from all                                                           │
│    Allow from 特定の相手                                                   │
│</Directory>                                                                │
└──────────────────────────────────────┘
「Order」は処理順をあらわし、全てをアクセス拒否してから、
特定の相手のみ許可することになる。
よって、優先順とは逆になる。
(後の方が上書となるので結果的に優先順が高くなる)

特定の相手のみアクセスを拒否したい場合(残りは全てアクセス許可)。
┌──────────────────────────────────────┐
│<Directory ディレクトリ>                                                    │
│    Order allow,deny                                                        │
│    Allow from all                                                          │
│    Deny from 特定の相手                                                    │
│</Directory>                                                                │
└──────────────────────────────────────┘
「Order」は処理順をあらわし、全てをアクセス許可してから、
特定の相手のみ拒否することになる。
よって、優先順とは逆になる。
(後の方が上書となるので結果的に優先順が高くなる)


特定の相手はIPアドレス、ホスト名で指定します
#なお、前述の通り「all」にすれば「全て」の意味になる。

IPアドレスの場合は前方一致検索になる。
・「192.168.1.1」の場合  →  「192.168.1.1」が該当
・「192.168.1」  の場合  →  「192.168.1.0~255」が該当

ホスト名の場合は後方一致検索になる。
・「.xxx.com」の場合     →  「.xxx.com」や「xxx.xxx.com」などが該当
分類:Apache
前へ 1 2 次へ