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

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

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

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

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

Q&A

解決済

2回答

3734閲覧

nginxのhttp_auth_requestの機能について

test_y

総合スコア0

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

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

0グッド

0クリップ

投稿2021/01/12 05:54

編集2021/01/12 06:15

前提・実現したいこと

Linux初学者です。

とあるウェブサーバでnginxの機能を使ってログインしている人のみ特定のファイルやURLを表示できるようにしたいと考えております。
ログインの情報はPHPのsessionを使用して管理したいと考えております。

現在、下記の通り設定をしたところエラーが発生しておりまして、対応方法を調べております。
ローカル環境のみの運用となるため、SSLの設定はしておりません。
ご存知の方がおりましたら教えていただけませんでしょうか。
よろしくお願いいたします。

発生している問題・エラーメッセージ

ブラウザでの表示

500 Internal Server Error

/var/log/nginx/error.log

2021/01/12 14:34:54 [error] 2675#2675: *26 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.1", subrequest: "check.php", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "xxx.xxx.xxx.xxx:8080" 2021/01/12 14:34:54 [error] 2675#2675: *26 auth request unexpected status: 404 while sending to client, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.1", host: "xxx.xxx.xxx.xxx:8080"

該当のソースコード

check.php

php

1<?php 2if ( empty($_COOKIE) ){ 3} 4session_start(); 5if ( !empty($_SESSION['login']) ) { 6 http_response_code(200); 7echo '200'; 8 return ; 9}else{ 10 http_response_code(401); 11 echo '401'; 12 return ; 13 14}

index.php

php

1<?php 2//セッションを使うことを宣言 3session_start(); 4 5//データベースに接続する 6try { 7 $pdo = new PDO('mysql:host=localhost; dbname=xxx', 'xxx', 'xxx', [ 8 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 9 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 10 ]); 11} 12catch (PDOExeption $e) { 13 exit ('データベースエラー'); 14} 15 16//ログイン状態の場合ログイン後のページにリダイレクト 17if (isset($_SESSION["login"])) { 18 session_regenerate_id(TRUE); 19 header("Location: success.php"); 20 exit(); 21} 22 23//postされて来なかったとき 24if (count($_POST) === 0) { 25 $message = ""; 26} 27//postされて来た場合 28else { 29 //ユーザー名またはパスワードが送信されて来なかった場合 30 if(empty($_POST["uname"]) || empty($_POST["pass"])) { 31 $message = "ユーザー名とパスワードを入力してください"; 32 } 33 //ユーザー名とパスワードが送信されて来た場合 34 else { 35 //post送信されてきたユーザー名がデータベースにあるか検索 36 try { 37 $stmt = $pdo -> prepare('SELECT * FROM users WHERE name=?'); 38 $stmt -> bindParam(1, $_POST['uname'], PDO::PARAM_STR, 10); 39 $stmt -> execute(); 40 $result = $stmt -> fetch(PDO::FETCH_ASSOC); 41 } 42 catch (PDOExeption $e) { 43 exit('データベースエラー'); 44 } 45 46 session_regenerate_id(TRUE); //セッションidを再発行 47 $_SESSION["login"] = $_POST['uname']; //セッションにログイン情報を登録 48 header("Location: success.php"); //ログイン後のページにリダイレクト 49 exit(); 50 51 } 52} 53 54$message = htmlspecialchars($message); 55?> 56 57<!DOCTYPE html> 58<html lang="ja"> 59<head> 60<meta charset="UTF-8"> 61<title>ログインページ</title> 62<link href="login.css" rel="stylesheet" type="text/css"> 63</head> 64<body> 65<h1>ログインページ</h1> 66<div class="message"><?php echo $message;?></div> 67<div class="loginform"> 68 <form action="index.php" method="post"> 69 <ul> 70 <li>ユーザー名:<input name="uname" type="text"></li> 71 <li>パスワード:<input name="pass" type="password"></li> 72 <li><input name="送信" type="submit"></li> 73 </ul> 74 </form> 75</div> 76</body> 77</html>

/etc/nginx/conf.d/default.conf

conf

1server { 2 listen 8080; 3 server_name localhost; 4 5 location / { 6 index index.html; 7 root /var/www/html; 8 } 9 10 error_page 500 502 503 504 /50x.html; 11 location = /50x.html { 12 } 13 14 location ~ .php$ { 15 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; 16 fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 17 include fastcgi_params; 18 } 19 20 location /index.html { 21 auth_request check.php; 22 error_page 401 =302 index.php; 23} 24 25}

補足情報(FW/ツールのバージョンなど)

使用OS CentOS7 2009
VMware Workstation 15 playerにインストールしてます
PHP 8.0.1 (cli)
nginx 1.18.0
MySQl 8.0.22

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

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

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

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

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

guest

回答2

0

自己解決

conf

1server { 2 listen 8080; 3 server_name xxx.xxx.xxx.xxx; 4 5 location /proxy/ { 6 proxy_pass http://xxx.xxx.xxx.xxx:8080/test/check.php; 7 proxy_set_header Host $host; 8 proxy_set_header X-Real-IP $remote_addr; 9 proxy_set_header X-Scheme $scheme; 10 proxy_set_header X-Auth-Request-Redirect $request_uri; 11 } 12 13 location = /proxy/auth/ { 14 proxy_pass http://xxx.xxx.xxx.xxx:8080/test/check.php; 15 proxy_set_header Host $host; 16 proxy_set_header X-Real-IP $remote_addr; 17 proxy_set_header X-Scheme $scheme; 18 # nginx auth_request includes headers but not body 19 proxy_set_header Content-Length ""; 20 proxy_pass_request_body off; 21 } 22 23 location / { 24 auth_request /proxy/auth/; 25 error_page 401 =302 http://xxx.xxx.xxx.xxx:8080/test/index.php; 26 root /var/www/html; 27 index index.html; 28 } 29 30 location ~ .php$ { 31 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; 32 fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 33 include fastcgi_params; 34 } 35}

この記述で設定を反映させたところ、問題なく機能しました。

投稿2021/01/13 05:06

test_y

総合スコア0

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

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

0

少し編集したら500エラーは吐かなくなったがauth_requestが効いていない

conf

1server { 2 listen 8080; 3 server_name localhost; 4 5 location / { 6 index index.html; 7 root /var/www/html; 8 } 9 10 error_page 500 502 503 504 /50x.html; 11 location = /50x.html { 12 } 13 14 location ~ .php$ { 15 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; 16 fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 17 include fastcgi_params; 18 } 19 20 location /auth { 21 index index.html; 22 root /var/www/html; 23 auth_request check.php; 24 error_page 401 =302 index.php; 25} 26 27}

投稿2021/01/12 06:31

編集2021/01/12 06:41
test_y

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問