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

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

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

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

PHP

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

Q&A

解決済

2回答

1350閲覧

PRGパターンのリファラの残り方

annderber

総合スコア98

Apache

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

PHP

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

0グッド

0クリップ

投稿2018/05/01 14:41

編集2018/05/02 02:38

お世話になります。

PRGパターンを使用してリダイレクトした場合、
POSTした際のリクエストがリファラーに残らず、戻るボタンを押して進むボタンを押しても
再送信の確認画面が出ないという利点があると思いますが、
なぜ、リダイレクトするとリファラにPOSTしたときの情報が残らないのでしょうか。
そういう仕様だと言われればそこまでなのですが、

何かそのあたりの説明が分かり易く載っているサイトなどあったら教えていただけると助かります。

よろしくお願いいたします。

〇追記:コード例
検証用に作成したコード、フレームワークcodeigniterを使用しています。
処理の流れは以下の感じ

1.申し込み画面(entry.php)
2.申し込みボタンを押してPOST
3.サーバー側で登録後、リダイレクト(Location: http://root/recruit/entry/complete_entry)
4.クライアントリダイレクト要求を受け取ってhttp://root/recruit/entry/complete_entryにリクエスト

ここで2のリファラが残らないのはなぜでしょうか。

PHP

1<!--view/entry.php--> 2 3<?php echo validation_errors(); ?> 4 5<?php echo form_open('entry/post'); ?> 6 <div class="wrapper"> 7 <div class="entry_contents"> 8 <div class="contents_label"> 9 <label>お名前</label> 10 </div> 11 <div> 12 <input type="text" name="last_name" /> 13 <input type="text" name="first_name" /> 14 </div> 15 </div> 16 17 <div class="entry_contents"> 18 <div class="contents_label"> 19 <label>メールアドレス</label> 20 </div> 21 <div> 22 <input type="email" name="email" /> 23 </div> 24 </div> 25 26 <div class="entry_contents"> 27 <div class="contents_label"> 28 <label>電話番号</label> 29 </div> 30 <div> 31 <input type="text" name="phone_num" /> 32 </div> 33 </div> 34 35 <input type="submit" name="post" value="申し込み"/> 36 </div> 37</form>

PHP

1<?PHP 2<!--controller/Entry.php--> 3class Entry extends CI_Controller { 4 public function __construct() 5 { 6 parent::__construct(); 7 $this->load->helper('url_helper'); 8 $this->load->helper('func'); 9 $this->load->library('form_validation'); 10 } 11 12 public function post() 13 { 14 // entryモデルクラスロード。指定はすべて小文字で指定 15 $this->load->model('entry_model'); 16 17 // バリデーションルールセット 18 $this->form_validation->set_rules('last_name', '姓', 'required'); 19 $this->form_validation->set_rules('first_name', '名', 'required'); 20 $this->form_validation->set_rules('email', 'メールアドレス', 'required|valid_email'); 21 $this->form_validation->set_rules('phone_num', '電話番号', 'required'); 22 23 // バリデーションチェック 24 if ($this->form_validation->run() === FALSE) { 25 // チェックエラー 26 $this->view_wapper('entry'); 27 28 } else { 29 // 正常系 30 31       //データ登録 32 $this->entry_model->create_entry(); 33 34       //PRGパターン。リダイレクト 35 header("Location: http://root/recruit/entry/complete_entry", false, 303); 36 exit(); 37 } 38 } 39 40 public function complete_entry() 41 { 42 $this->view_wapper('entry_done'); 43 } 44 45 public function index() 46 { 47 $this->view_wapper('entry'); 48 } 49 50 private function view_wapper($contents) 51 { 52 $this->load->view('templates/header'); 53 $this->load->view($contents); 54 $this->load->view('templates/footer'); 55 } 56} 57

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

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

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

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

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

m.ts10806

2018/05/01 21:09

コードを例示していただけませんか?色々と検証されているようなのでそのコードのミニマム版で構いません。
annderber

2018/05/02 02:42

mst10806さん。コード例追記しました。
guest

回答2

0

ベストアンサー

以下の3つのファイルを作り確認してみました。

html

1<!DOCTYPE html> 2<form method="post" action="http://localhost/test/redirect/redirect.php"> 3<input type="submit" /> 4</form>

php

1redirect.php 2 3<?php 4header("Location: http://localhost/test/redirect/result.php", false, 303);?>

php

1result.php 2 3<?php 4$headers = apache_request_headers(); 5var_dump(compact('headers', '_POST', '_FILES'));

結果から

'Referer' => string 'http://localhost/test/redirect/test.html'

と、Referer は記述されていました。
検証に使用したブラウザは
FIrefox 59.0.2
です。

リダイレクトするとリファラにPOSTしたときの情報が残らない

仕様です。
ちなみにですが、post method の redirect は、仕様上は post であるべきらしいですが get に切り替わってしまいます。
理由はいろいろあるみたいですが、気にしておかないとまずい点です。

投稿2018/05/02 03:30

編集2018/05/02 03:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

annderber

2018/05/02 08:08

コメントありがとうございます。 仕様ということで納得いたしました。
guest

0

https://kiririmode.hatenablog.jp/entry/20160618/1466241269

↑こういうことを知りたいってことですかね?

投稿2018/05/02 02:08

k-nishiyama

総合スコア240

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

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

annderber

2018/05/02 02:42

コメントありがとうございます。 このサイトも分かり易く解説してくれていますが、リファラにPOSTした際の情報が残らない部分の記載が無いんですね。このサイトの内容だけ見ると、PRGパターンを使ってGETメソッドでリクエストし直すことで戻るボタンを押してもGETリクエストを行いますが、じゃあ戻るボタンを2回押したらPOSTメソッドを再送することにならないのかしらと思います。
k-nishiyama

2018/05/02 03:17

仕組みを詳しく記載をしているわけではないですが、「戻る」の挙動などを検証しているページなら↓ https://qiita.com/rubytomato@github/items/e90980d6b18204802779 お恥ずかしながら、私も仕組みを詳しく求められると苦しいので専門家の方にお任せしたいと思います・・・笑
annderber

2018/05/02 03:28

上記サイトも分かり易いですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問