🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Apache

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

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

1回答

4200閲覧

MAMP apache エラー AH01630: client denied by server configuration

shotail

総合スコア2

Apache

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

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

1グッド

0クリップ

投稿2020/12/09 20:24

編集2020/12/11 04:01

解決したい事

動画を見ながらお問い合わせフォームを作成中なのですが、ブラウザで入力した値がデータベースに
反映されず、アパッチのログにこちらのエラーが出ます。

apache

1[authz_core:error] [pid 13628] [client ::1:54775] AH01630: client denied by server configuration: /Applications/MAMP/htdocs/php_test/.DS_Store

エラーの出るタイミングはlocalhost:8888に繋いだ瞬間です。

試したこと

httpd-vhosts.confに<Directoryが何もなかったのでリンク内容の記事を参考に丸々追加。
</VirtualHost>

<Directory /Applications/MAMP/htdocs/>
Options FollowSymlinks Includes
AllowOverride All
AddType text/html .html
Require all granted
</Directory>
<VirtualHost *:80>

httpd.confの中にRequire all grantedを書きました。

追記
MAMP再インストール後、エラーで止まってるところまでのコードをudemyからダウンロードし、
mysqlにテーブルとユーザーを作り、エラーで止まる前までの動作確認は異常なし。
ローカルホストに繋いだ瞬間にclient denied by server configurationとエラーは出ましたが、
一応ブラウザのinput.phpからフォームに値を入れ、送信するも反映されません。
後は、MAMP起動時に前回のエラーも出でいたので、解決するためこちらのコードをターミナルで実行しました。
cd /Applications/MAMP/Library/pg/lib
rm libpq.5.dylib
rm libpq.dylib
ln -s libpq.5.7.dylib libpq.5.dylib
ln -s libpq.5.7.dylib libpq.dylib

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

Apache/2.4.46 (Unix) OpenSSL/1.0.2u PHP/7.4.9 mod_wsgi/3.5 Python/2.7.13 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.30.1

inputphp

1<?php 2 3session_start(); 4 5require 'validation.php'; 6 7header('X-FRAME-OPTIONS:DENY'); 8 9// スーパーグローバル変数 php 9種類 10// 連想配列 11if(!empty($_POST)){ 12 echo '<pre>'; 13 var_dump($_POST) ; 14 echo '</pre>'; 15} 16 17function h($str) 18{ 19 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 20} 21 22 23// 入力、確認、完了 input.php, confirm.php, thanks.php 24// CSRF 偽物のinput.php->悪意のあるページ 25// input.php 26 27$pageFlag = 0; 28$errors = validation($_POST); 29 30if(!empty($_POST['btn_confirm']) && empty($errors)){ 31 $pageFlag = 1; 32} 33if(!empty($_POST['btn_submit'])){ 34 $pageFlag = 2; 35} 36 37 38?> 39 40<!doctype html> 41<html lang="ja"> 42 <head> 43 <!-- Required meta tags --> 44 <meta charset="utf-8"> 45 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 46 47 <!-- Bootstrap CSS --> 48 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> 49 50 <title>Hello, world!</title> 51 </head> 52<body> 53 54 55<?php if($pageFlag === 1 ) : ?> 56<?php if($_POST['csrf'] === $_SESSION['csrfToken']) :?> 57<form method="POST" action="input.php"> 58氏名 59<?php echo h($_POST['your_name']) ;?> 60<br> 61メールアドレス 62<?php echo h($_POST['email']) ;?> 63<br> 64ホームページ 65<?php echo h($_POST['url']) ;?> 66<br> 67性別 68<?php 69 if($_POST['gender'] === '0'){ echo '男性'; } 70 if($_POST['gender'] === '1'){ echo '女性'; } 71?> 72<br> 73年齢 74<?php 75 if($_POST['age'] === '1'){ echo '〜19歳' ;} 76 if($_POST['age'] === '2'){ echo '20歳〜29歳' ;} 77 if($_POST['age'] === '3'){ echo '30歳〜39歳' ;} 78 if($_POST['age'] === '4'){ echo '40歳〜49歳' ;} 79 if($_POST['age'] === '5'){ echo '50歳〜59歳' ;} 80 if($_POST['age'] === '6'){ echo '60歳〜' ;} 81?> 82 83<br> 84お問い合わせ内容 85<?php echo h($_POST['contact']) ;?> 86<br> 87 88<input type="submit" name="back" value="戻る"> 89<input type="submit" name="btn_submit" value="送信する"> 90<input type="hidden" name="your_name" value="<?php echo h($_POST['your_name']) ;?>"> 91<input type="hidden" name="email" value="<?php echo h($_POST['email']) ;?>"> 92<input type="hidden" name="url" value="<?php echo h($_POST['url']) ;?>"> 93<input type="hidden" name="gender" value="<?php echo h($_POST['gender']) ;?>"> 94<input type="hidden" name="age" value="<?php echo h($_POST['age']) ;?>"> 95<input type="hidden" name="contact" value="<?php echo h($_POST['contact']) ;?>"> 96<input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']) ;?>"> 97</form> 98 99<?php endif; ?> 100 101<?php endif; ?> 102 103<?php if($pageFlag === 2 ) : ?> 104<?php if($_POST['csrf'] === $_SESSION['csrfToken']) :?> 105送信が完了しました。 106 107<?php unset($_SESSION['csrfToken']); ?> 108<?php endif; ?> 109<?php endif; ?> 110 111 112<?php if($pageFlag === 0 ) : ?> 113<?php 114if(!isset($_SESSION['csrfToken'])){ 115 $csrfToken = bin2hex(random_bytes(32)); 116 $_SESSION['csrfToken'] = $csrfToken; 117} 118$token = $_SESSION['csrfToken']; 119?> 120 121<?php if(!empty($errors) && !empty($_POST['btn_confirm']) ) : ?> 122<?php echo '<ul>' ;?> 123<?php 124 foreach($errors as $error){ 125 echo '<li>' . $error . '</li>' ; 126 } 127?> 128<?php echo '</ul>' ; ?> 129 130<?php endif ;?> 131 132<div class="container"> 133 <div class="row"> 134 <div class="col-md-6"> 135 <form method="POST" action="input.php"> 136 <div class="form-group"> 137 <label for="your_name">氏名</label> 138 <input type="text" class="form-control" id="your_name" name="your_name" value="<?php if(!empty($_POST['your_name'])){echo h($_POST['your_name']) ;} ?>" required> 139 </div> 140 141 <div class="form-group"> 142 <label for="email">メールアドレス</label> 143 <input type="email" class="form-control" id="email" name="email" value="<?php if(!empty($_POST['email'])){echo h($_POST['email']) ;} ?>" required> 144 </div> 145 146 <div class="form-group"> 147 <label for="url">ホームページ</label> 148 <input type="url" class="form-control" id="url" name="url" value="<?php if(!empty($_POST['url'])){echo h($_POST['url']) ;} ?>"> 149 </div> 150 151性別 152 <div class="form-check form-check-inline"> 153 <input class="form-check-input" type="radio" name="gender" id="gender1" value="0" 154 <?php if(!empty($_POST['gender']) && $_POST['gender'] === '0' ) 155 { echo 'checked'; } ?>> 156 <label class="form-check-label">男性</label> 157 <input class="form-check-input" type="radio" name="gender" id="gender2" value="1" 158 <?php if(!empty($_POST['gender']) && $_POST['gender'] === '1' ) 159 { echo 'checked'; } ?>> 160 <label class="form-check-label">女性</label> 161 </div> 162 163 <div class="form-group"> 164 <label for="age">年齢</label> 165 <select class="form-control" id="age" name="age"> 166 <option value="">選択してください</option> 167 <option value="1">〜19歳</option> 168 <option value="2">20歳〜29歳</option> 169 <option value="3">30歳〜39歳</option> 170 <option value="4">40歳〜49歳</option> 171 <option value="5">50歳〜59歳</option> 172 <option value="6">60歳〜</option> 173 </select> 174 </div> 175 176 <div class="form-group"> 177 <label for="contact">お問い合わせ内容</label> 178 <textarea class="form-control" id="contact" row="3" name="contact"> 179 <?php if(!empty($_POST['contact'])){echo h($_POST['contact']) ;} ?> 180 </textarea> 181 </div> 182 183 <div class="form-check"> 184 <input class="form-check-input" type="checkbox" id="caution" name="caution" value="1"> 185 <label class="form-check-label" for="caution">注意事項にチェックする</label> 186 </div> 187 188 <input class="btn btn-info" type="submit" name="btn_confirm" value="確認する"> 189 <input type="hidden" name="csrf" value="<?php echo $token; ?>"> 190 </form> 191 192 </div><!-- .col-md-6 --> 193 </div> 194</div> 195 196<?php endif; ?> 197 198 <!-- Optional JavaScript --> 199 <!-- jQuery first, then Popper.js, then Bootstrap JS --> 200 <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> 201 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> 202 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script> 203 </body> 204</html> 205 206

validationphp

1<?php 2 3function validation($request){ //$_POST連想配列 4 5 $errors = []; 6 7 if(empty($request['your_name']) || 20 < mb_strlen($request['your_name']) ){ 8 $errors[] = '「氏名」は必須です。20文字以内で入力してください。'; 9 } 10 11 if(empty($request['email']) || !filter_var($request['email'], FILTER_VALIDATE_EMAIL)){ 12 $errors[] = '「メールアドレス]は必須です。正しい形式で入力してください。'; 13 } 14 15 if(!empty($request['url'])){ 16 if(!filter_var($request['url'], FILTER_VALIDATE_URL)){ 17 $errors[] = '「ホームページ」は正しい形式で入力してください。'; 18 } 19 } 20 21 if(!isset($request['gender'])){ 22 $errors[] = '「性別」は必須です。'; 23 } 24 25 if(empty($request['age']) || 6 < $request['age']){ 26 $errors[] = '「年齢」は必須です。' ; 27 } 28 29 30 if(empty($request['contact']) || 200 < mb_strlen($request['contact']) ){ 31 $errors[] = '「お問い合わせ内容」は必須です。200文字以内で入力してください。'; 32 } 33 34 if(empty($request['caution'])){ 35 $errors[] = '「注意事項」をご確認ください。'; 36 } 37 38 return $errors; 39} 40 41?>
退会済みユーザー👍を押しています

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

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

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

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

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

m.ts10806

2020/12/09 22:30

そもそもconfいじらなきゃできないわけでもないと思うのですが。
退会済みユーザー

退会済みユーザー

2020/12/10 00:27

確かに。初期状態に戻せば良いような気がします。
shotail

2020/12/10 05:50

m.tsさんコメントありがとうございます。 自分が無能のあまり,confのバックアップも取らずにいじってしまいました。 自分で変更したとこは戻したつもりなのですが・・・
m.ts10806

2020/12/10 09:16

完全アンインストールからの再インストールで良いのでは。 よく分からないまま設定ファイルをいじるのが一番危ないです。 プログラムもそうですが書いたとおりにしか動かないので 設定も何か1つでも不備があれば当然動きません。
shotail

2020/12/10 13:14

m.tsさんアドバイスありがとうございます。 完全アンインストールからの再インストールしたのですが、エラーは解消されず 前回のエラーもまた発生し、そこはすぐ解決出来ました。 調べていく中で思った事が、OsをBig Surにアップデートした事ではないかと考えているのですが、 m.tsさんのご意見いただけないでしょうか?
m.ts10806

2020/12/10 22:26

Mac持ってないのでOS依存の意見を求められているのでしたらお応えできません。 前回が何の話か分かりませんが、設定いじらずに起動しようとしましたか?いじってからでしたら同じ事です。
shotail

2020/12/11 03:53

m.tsさん回答ありがとうございます。 設定はもう怖くていじれないので、再インストール後すぐに起動いたしました。
guest

回答1

0

ベストアンサー

接続先は localhost:8888 ということなので VirtualDomain のカスタマイズは不要と思います。

MAMP/conf/apache/httpd.conf にはすでに /Applications/MAMP/htdocs で公開するように設定されています。

... ServerName localhost:8888 DocumentRoot "/Applications/MAMP/htdocs" ... <Directory "/Applications/MAMP/htdocs"> Options All AllowOverride All Require all granted XSendFilePath "/Applications/MAMP/htdocs" </Directory> ...

仮に VirtualDomain で使いたい場合は、
MAMP/conf/apache/httpd.conf

# Virtual hosts #Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

この行を有効にする必要がありますが、今回は不要(コメントアウトのままで良い)なのでは。

vhostの変更分も元の状態に戻しておいてください。
/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

NameVirtualHost *:80 <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/Applications/MAMP/Library/docs/dummy-host.example.com" ServerName dummy-host.example.com ServerAlias www.dummy-host.example.com ErrorLog "logs/dummy-host.example.com-error_log" CustomLog "logs/dummy-host.example.com-access_log" common </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@dummy-host2.example.com DocumentRoot "/Applications/MAMP/Library/docs/dummy-host2.example.com" ServerName dummy-host2.example.com ErrorLog "logs/dummy-host2.example.com-error_log" CustomLog "logs/dummy-host2.example.com-access_log" common </VirtualHost>

追記

submitの処理

php

1<?php if($pageFlag === 2 ) : ?> 2<?php if($_POST['csrf'] === $_SESSION['csrfToken']) :?> 3送信が完了しました。 4 5<?php unset($_SESSION['csrfToken']); ?> 6<?php endif; ?> 7<?php endif; ?>

この $pageFlag === 2 の場合に insert.php の処理を呼ぶ必要があるのでは?

index.phpの設置

/Applications/MAMP/htdocs/phpinfo.php
このファイル名を、
/Applications/MAMP/htdocs/index.php
に変えてみてください。

投稿2020/12/10 00:44

編集2020/12/11 05:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shotail

2020/12/10 05:44

kazwedaさん、VirtualDomainの解説まで丁寧にありがとうございます。 今後参考にさせて頂きます。 Vhostのファイルは全部コメントアウトしました。 自分が無能なためhttpd.confのバックアップもとらずにいじってしまって、書き込んだRequire all granted は削除し、再起動したのですが直りません。やはりhttp.confの設定がおかしくなっているのでしょうか? ちなみに質問を編集して更新しようとしたのですが、文字数オーバーでコメントアウトされているところを全部消してもダメでした。
退会済みユーザー

退会済みユーザー

2020/12/10 15:11 編集

MAMP/conf/apache/httpd.conf GitHubに置きましたので確認してください。 (不要と思うのでGitHubから削除しました)
shotail

2020/12/10 13:06

kazwedaさん、わざわざありがとうございます。 確認させて頂きまして、ファイルの中間あたりのXSendFilePath "/Applications/MAMP/htdocs/php_testと、もう一箇所php_testがあるかないかのないかの違いで修正し、再起動しましたがダメでした。 m.tsさんの意見も参考にさせて頂き、完全アンインストールして再インストールしたところ、前回kazwedaさんに解決していただいたエラーもまた発生し、今回のエラーも解決されませんでした。 前回のエラーは前の方法ですぐ解決することが出来ました。 私は調べて行く中で思った事が、OsをBig Surにアップデートしたせいかと考えていますが、 kazwedaさんのご意見をいただけないでしょうか?
退会済みユーザー

退会済みユーザー

2020/12/10 14:36 編集

再インストールの後、何を追加変更しているのかを質問に追記していただけますか?コメント部分は不要です。書き換えた部分だけで構いません。ちなみに例えば、htdocs に <?php phpinfo();?> と書いた phpinfo.php ファイルを置けば表示ができる状態にあるのでしょうか。 あー、すみません。前回の質問のコメントにある insert.php を開くときのエラーですね。
退会済みユーザー

退会済みユーザー

2020/12/10 15:10 編集

というか insert.php は function insertContact($request){ ... } という関数の定義なので、そもそもブラウザから insert.php を開いても動かないのでは? PHPファイルの構成については、講師の方がいらっしゃるのであればそちらに確認していただいた方が良いと思います。 手元の環境は、 macOS 11.0.1 MAMP 6.2 初期状態でhtdocsにphpファイルを置いてPDO接続も問題ないです。
shotail

2020/12/10 17:30

kazwedaさん、再インストール後何をしたか質問に追記いたしました。 htdocsで<?php phpinfo();?>と書いたphpinfo.phpを作成しブラウザでちゃんと phpinfoのページは表示されました。 ちなみにinsert.phpは今のエラーで止まる前のコードでアクセスすると、そのphp内で入力した値は DBに反映されるようになってまして、そちらは確認いたしました。 動画では前回の質問でアップしたコードとブラウザ上でinput.phpに値を入れて送信するとDBに反映されていました。
退会済みユーザー

退会済みユーザー

2020/12/10 21:25

/Applications/MAMP/conf/apache/httpd.conf /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf 現在はこの2つのファイルは初期状態(変更なし)で libpq.5.dylib, libpq.dylib のシンボリックリンク修正のみ、という理解で良いでしょうか。 その場合、DocumentRoot になっている /Applications/MAMP/htdocs ここにあるファイル名を教えてください。 それと input.php を貼っていただくことはできますか。
shotail

2020/12/11 04:17

はい、その2つのファイルは初期状態で、libpq.5.dylib, libpq.dylibのみターミナルで修正いたしました。 /Applications/MAMP/htdocs/の中にあるファイルはphp_test, phpinfo.phpのみで、 php_testの中にform, mainteというフォルダがあり、formの中にinput.php, validation.phpがあり、 mainteの中に前回アップした5つのファイルがあります。 input.phpとvalidation.phpを質問の方に貼りましたので、お時間がある時にでも 確認いただけますと嬉しいです。
退会済みユーザー

退会済みユーザー

2020/12/11 05:15

ご回答ありがとうございます。 追記しましたのでご確認お願いします。
shotail

2020/12/11 12:19

kazwedaさん、input.phpのブラウザで入力した値をDBに反映させることが出来ました!!! kazwedaさんのおっしゃる通りinsert.phpを呼び込む処理が抜けていました。 udemyからコードをダウンロードした時の確認不足という凡ミスで申し訳ないです。 本当にありがとうございます!!!! 挫折しそうだったのですがもう少し頑張れそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問