nginx + php の「入力ファイルが指定されていません」の解決策

nginx + php の「入力ファイルが指定されていません」の解決策

本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。設定ファイル、設定パス、権限を繰り返し確認しましたが、問題はありませんでした。調査を繰り返した結果、ようやく問題が見つかりました。問題と解決策は以下のとおりです。

原因分析

GitHub からオープンソースの tp5 プロジェクトをダウンロードしましたが、以前はローカル Web サイトが問題なく動作していました。しかし、このオープンソース プロジェクトをインストールした後、他のローカル Web サイトにアクセスできないことがわかりました。アクセス時に入力ファイルが指定されていないというエラーが発生します。インターネットでも解決策を探しましたが、どれもうまくいきませんでした。このエラーは少し奇妙であるようです。

何度も試行した後、コンピューターを再起動すると問題は解決しました。ただし、ダウンロードした tp5 オープンソース プロジェクトを再度実行すると、他の Web サイトで「入力ファイルが指定されていません」というエラーが表示され、この 1 つの Web サイトだけが問題なく実行されました。

これに基づいて、オープンソース プロジェクトの nginx 構成ファイルにエラーが特定されました。設定ファイルを見てみましょう:

サーバー{
  聞く 80;
  サーバー名 local.test.com;
  access_log /data/wwwlogs/local.test.com.log を結合します。
  error_log /data/wwwlogs/local.test.com_error.log エラー;
  インデックス index.html index.htm index.php;
  ルート /data/php/test;

  add_header X-Powered-Host $hostname;
  fastcgi_hide_header X-Powered-By;

  if (!-e $request_filename) {
    最後に ^/(.+?\.php)/?(.*)$ /$1/$2 を書き換えます。
    最後に ^/(.*)$ /index.php/$1 を書き換えます。
  }

  場所 ~ \.php($|/){
    fastcgi_index インデックス.php;
    127.0.0.1:9000; をデフォルトとして設定します。
    fastcgi_params を含めます。
    $real_script_name を $fastcgi_script_name に設定します。
    $real_script_name ~ "^(.+?\.php)(/.+)$") の場合 {
      $real_script_name を $1 に設定します。
    }
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param PHP_VALUE open_basedir=$document_root:/tmp/:/proc/;
  }

  場所 ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    access_log オフ;
    error_log オフ;
    有効期限は30日です。
  }

  場所 ~ .*\.(js|css)?$ {
    access_log オフ;
    error_log オフ;
    12時間で期限切れになります。
  }

上記の構成では、残りは従来の構成です。 CGI を使用するためです。 fastcgi パラメータに、お気づきの行があります。

fastcgi_param PHP_VALUE open_basedir=$document_root:/tmp/:/proc/;

それでおしまい。この文の主な機能は、クロスサイトを防ぐために fastcgi の操作可能なディレクトリを設定し、open_basedir をこのプロジェクトのディレクトリと /tmp/ および /proc/ に制限することです。

問題解決

先ほど、設定された fastcgi 構成にクロスサイトを防止するための追加のステートメントがあると述べました。そして、この文は実際には fastcgi 全体のパラメータに影響します。私の他の Web サイトのパスは /data/php/xxx/ のようなディレクトリですが、このオープン ソース プロジェクトの /data/php/test/ ディレクトリにはないため、fastcgi は見つかりません。
したがって、この文の前に # を追加してコメントアウトするか、削除してシステムを再起動するか、nginx を再起動します。

オンライン展開の推奨事項

それで、この文を使うべきでしょうか、それとも使わないべきでしょうか?もちろんオンライン環境でも可能です。オンライン プロジェクトのデプロイメントでは、open_basedir で $document_root などの変数を使用しないことが最善です。オンライン サーバーに複数のプロジェクトがある場合、すべてのプロジェクトを統合されたディレクトリに配置できます。たとえば、私のオンライン ディレクトリは、他の Web サイトが配置されている wwwroot です。例えば、/wwwroot/test1 /wwwroot/test2のように設定できます。

fastcgi_param PHP_VALUE open_basedir=/wwwroot/:/tmp/:/proc/;

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • PHPフレームワークCI(codeigniter)の自動読み込みと自律オブジェクト作成操作例の分析
  • PHP5.6+ での「入力ファイルが指定されていません」問題の解決方法
  • PHPはhtmlspecialchars()関数をフィルタリングして、定義済み文字をHTMLエンティティ使用分析に変換します。
  • Plesk PHP7 で Oracle OCI8 拡張機能を有効にする方法の概要
  • PHP htmlspecialchars() 関数の使い方と例の説明
  • PHP htmlspecialchars_decode() 関数の使用方法の説明
  • PHP htmlspecialchars() 関数のサンプルコードと使用法
  • PHP CIフレームワーク学習説明

<<:  MySQL zip アーカイブ バージョン (5.7.19) の詳細なインストール チュートリアル

>>:  mysql5.7.19 zip 詳細なインストールプロセスと構成

推薦する

WindowsシステムでPhPStudy MySQLの起動に失敗する問題を解決する

エラーを報告するApache\Nginx サービスは正常に起動しましたが、MySQL は起動に失敗し...

Golang を使って Docker API を実際に操作する

目次SDKのインストールローカル Docker の管理コンテナの実行バックグラウンドでコンテナを実行...

DevUI で独自の Angular コンポーネント ライブラリを構築する方法

目次序文コンポーネントライブラリの作成主要な構成の変更ディレクトリレイアウトの調整ライブラリ構築のた...

適応的な幅と高さを持つ9つの正方形グリッドの背景画像の切り取りの分析

<br />幅と高さが適応するオリジナルの 9 グリッド レイアウトをベースに、ネットワ...

プライベートDockerリポジトリであるHarborをインストールするための詳細な手順

Harborのインストールは非常に簡単ですが、Dockerログインで行き詰まってしまいました。このブ...

Dockerfile を使用したカスタムイメージの構築の実装

目次序文Dockerfile の紹介Dockerfileはイメージプロセスを構築するDockerfi...

ウェブページの背景画像を伸ばす2つの方法

解決策は2つあります。 1つはCSSで、background-size:coverを使用して画像の伸...

JavaScript のドキュメント オブジェクト モデル (DOM)

目次1. DOMとは何か2. 要素を選択する3. getElementById() 4. クエリセレ...

フレックスボックスレイアウトの最終行の左揃えの実装アイデア

フレックスレイアウトを使用すると、9つの正方形のグリッドであれば、図に示すように均等に分割できます。...

HTMLからPDFへの変換のための純粋なクライアント側と純粋なサーバー側の実装ソリューション

必要ユーザーがフォームに入力して「保存」をクリックすると、PDF ドキュメントを直接ダウンロードでき...

Linux 3.X/4.x/5.x でパゴダ パネルのパスワードを忘れた場合の解決方法

ssh に入り、次のコマンドを入力してパスワードをリセットします (コマンドの末尾の「testpas...

ウェブメッセージボード機能を実現するjs

この記事の例では、Webメッセージボードを実装するためのjsの具体的なコードを参考までに共有していま...

Vue ログインページ用の動的パーティクル背景プラグインの実装

目次動的パーティクル効果は次のとおりです。プラグインをインストールする動的パーティクル効果は次のとお...

MySQL ALTERコマンドの知識ポイントのまとめ

テーブル名を変更したり、テーブル フィールドを変更したりする必要がある場合は、 MySQL ALTE...

JS での new の手書き実装

目次1 新しいオペレータの紹介2 新しいものは何をしましたか? 3 新しい演算子の実装をシミュレート...