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

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

詳細はこちら
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

1800閲覧

Laravelのpaginate()メソッドでかえってくる項目の中にhttpsがついていないのでhttpsにしたい

zfanr

総合スコア14

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2019/10/28 11:45

編集2019/10/28 15:02

事象

下記のチュートリアルを見てサイトを完成させました。ローカル環境では問題なく動いていました。
herokuにアップすると詳細画面は表示されますが一覧画面が表示されません。(投稿が一件も表示されない)

https://www.hypertextcandy.com/vue-laravel-tutorial-list-photos/

ブラウザのコンソールにエラーが出ているのが原因だと思いました。

laravelのpaginate()メソッドが返すjsonの中にhttpのアドレスが含まれているせいだと思うのでこれを、httpsにする方法が知りたいです。

エラー内容

Mixed Content: The page at 'https://<アプリ名>.herokuapp.com/?page=1' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://<アプリ名>.herokuapp.com/api/photos?page=1'. This request has been blocked; the content must be served over HTTPS.

app/Http/Controllers/PhotoController.php

php

1 /** 2 * 写真一覧 3 */ 4 public function index() 5 { 6 $photos = Photo::with(['owner', 'likes']) 7 ->orderBy(Photo::CREATED_AT, 'desc')->paginate(); 8 9 return $photos; 10 }

Jsonの中身

json

1{ 2 "current_page":1, 3 "data":[ 4 { 5 "id":"EcrjI8oSchZG", 6 "url":"https://<バケット名>.s3.ap-northeast-1.amazonaws.com/EcrjI8oSchZG.jpeg", 7 "likes_count":0, 8 "liked_by_user":false, 9 "owner":{ 10 "name":"<名前>" 11 } 12 }, 13 { 14 "id":"nQAlljx922x3", 15 "url":"https://<バケット名>.s3.ap-northeast-1.amazonaws.com/nQAlljx922x3.jpeg", 16 "likes_count":0, 17 "liked_by_user":false, 18 "owner":{ 19 "name":"<名前>" 20 } 21 }, 22 { 23 "id":"DXcd2dMOE2J6", 24 "url":"https://<バケット名>.s3.ap-northeast-1.amazonaws.com/DXcd2dMOE2J6.jpeg", 25 "likes_count":0, 26 "liked_by_user":false, 27 "owner":{ 28 "name":"<名前>" 29 } 30 } 31 ], 32 "first_page_url":"http://<アプリ名>.herokuapp.com/api/photos?page=1", 33 "from":1, 34 "last_page":1, 35 "last_page_url":"http://<アプリ名>.herokuapp.com/api/photos?page=1", 36 "next_page_url":null, 37 "path":"http://<アプリ名>.herokuapp.com/api/photos", 38 "per_page":15, 39 "prev_page_url":null, 40 "to":3, 41 "total":3 42}

環境

Laravel Framework 5.8.35

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

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

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

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

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

guest

回答1

0

ベストアンサー

herokuの場合
一旦sslを受け止めたサーバがリバースプロキシしたAPサーバにHTTPでプロキシするようになっているので
ブラウザではHTTPSだがLaravelはHTTPでアクセスされたと誤認します。

こういうのを参考に
HTTPSを強制しましょう

投稿2019/10/29 07:09

mikkame

総合スコア5036

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

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

zfanr

2019/10/30 15:04

mikkameさん 回答いただきありがとうございます。 web.phpとapi.phpに以下の記述を足してみたのですが一覧画面の写真は表示されないままでした。 ``` URL::forceScheme('https'); ``` そこで、よく見て見るとajaxリクエストが2回発生しており1回目のリクエスト(photosの後にスラッシュが付いている)がキャンセルとなっていて2回目のリクエスト(photosの後にスラッシュが付いていない)が失敗となっておりました。 1回目 https://<アプリ名>.herokuapp.com/api/photos/?page=1 2回目 http://<アプリ名>.herokuapp.com/api/photos?page=1 これはローカルの時も同様に2回発生しており、ローカルでは1回目が301moved permanently(今、手元に作業していたパソコンがないので301のコードなどについては記憶が少しだけ曖昧ですが) となっており2回目のリクエストで正常にレスポンスが返ってきていました。 ローカルでもheroku環境でもスラッシュつきのアドレスにリクエストするとリダイレクト?のようなものが発生して、スラッシュなしのほうにもう一度リクエストするようでした。その際にheroku環境ではhttpsがhttpになるのが原因のようでしたので、リクエストする箇所をスラッシュなしにすること1回目のリクエストで正常にレスポンスが取得できて一覧ページの写真が表示されました。 PhotoList.vue 変更前 ``` async fetchPhotos () { const response = await axios.get(`/api/photos/?page=${this.page}`) /* 略 */ } ``` 変更後 ``` async fetchPhotos () { const response = await axios.get(`/api/photos?page=${this.page}`) /* 略 */ } ``` ただ、写真の表示自体はできましたが、jsonの中のアドレスは以下のようにhttpになってしまっているのでこれはこれで問題だと思っております。その際にご提示いただいた内容の対策が必要なのかなと思っています。 "next_page_url":"http://<アプリ名>.herokuapp.com/api/photos?page=2" herokuのサーバーの仕様についても教えていただいてありがとうございます。
zfanr

2019/10/30 15:05

写真の表示自体はできたので一旦これでクローズいたします。 ありがとうございました。
mikkame

2019/10/30 15:53

スラッシュ付きをスラッシュなしに変更するのはlaravelの仕様です。 htaccessを確認してみてください。 リダイレクト処理が書いてあるはずです
zfanr

2019/11/01 06:33

htaccessに記述がありました。(なんとなく理解できるレベルです) この処理がhttpsをhttpに変えてしまっていたのですね # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] いろいろ調べて下記などが関係するのかなと思いました。ただ、いろいろ試していたら挙動がよくわからなくなってしまいましたが、教えていただきありがとうございます。 https://help.heroku.com/J2R1S4T8/can-heroku-force-an-application-to-use-ssl-tls https://stackoverflow.com/questions/1329647/force-ssl-https-with-mod-rewrite/34065445#34065445
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問