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

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

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

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

Q&A

1回答

951閲覧

Laravel7でchromiumから自分自身へアクセスさせたい

sk_

総合スコア18

Laravel

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

0グッド

0クリップ

投稿2022/06/06 06:03

編集2022/06/06 06:31

ご覧いただきありがとうございます。

質問

Laravel自身に外部(?)からのアクセスをブロックする機能がデフォルトで備わっているか?

目的

Laravel7上で作ったWebページをPDFにして出力したいというのが大きな目的です。
そのWebページではJavaScriptを使ったチャート図の生成などをしており、
サーバーサイド(PHP)でPDFのチャート図生成のハードルが高く、
chromiumによるヘッドレスブラウザにてWebページを表示、その後PDFに変換したいと考えております。

済んでいること

・chrome-php/chromeのLaravelプロジェクトへのインストール
・Webページへのアクセス処理

php

1 public function pdf() 2 { 3 $browserFactory = new BrowserFactory(); 4 5 // starts headless chrome 6 $browser = $browserFactory->createBrowser([ 7 //debugs 8 'headless' => false, // disable headless mode 9 'connectionDelay' => 0.8, // add 0.8 second of delay between each instruction sent to chrome, 10 'debugLogger' => 'php://stdout', // will enable verbose mode 11 12 //options 13 'ignoreCertificateErrors' => true, 14 ]); 15 16 // creates a new page and navigate to an url 17 $page = $browser->createPage(); 18 $url = route('question.result.html'); // 【NG】ローカルのPDF化したいページ 19 // $url = 'https://google.com'; // 【OK】外部サイト 20 // $url = 'http://localhost:8001'; // 【OK】ローカルのフレームワークなしテストページ 21 $page->navigate($url)->waitForNavigation(); 22 23 // get page title 24 $pageTitle = $page->evaluate('document.title')->getReturnValue(); 25 26 $filename = uniqid(sprintf('%02x', random_int(0, 255))); // 4e5ce3dd8d7e2de 27 // screenshot 28 $page->screenshot()->saveToFile(storage_path('/app/pdf/'.$filename.'.png')); 29 30 // pdf 31 $page->pdf(['printBackground'=>false])->saveToFile(storage_path('/app/pdf/'.$filename.'.pdf')); 32 33 // bye 34 $browser->close(); 35 36 }

困っていること

作成したプログラムから、Webページにアクセスした際の挙動に差があり、
PDF化したいページが読み込めない。

パターンとしては次のようであり、Laravel自身が何かブロックしているような挙動に感じております。
NG: ローカルのPDF化したいページ(Laravel)
OK: 外部サイト(https://google.com)
OK: ローカルのプレーンPHP(Laravelではない)

Laravel自身に、botからのアクセスやローカルホストからのアクセスを制限するような仕組みがあるのでしょうか
心当たりのある方おられましたら、アドバイスいただけると幸いです。

--追記 ご指摘いただいた点
・Laravel側にブロックしたようなログは残っておりませんでした。
単にchromiumのライブラリ(ページにアクセスする関数)が、タイムアウトを返したログのみでした

->waitForNavigation() で処理は終了したようで

 [2022-06-06 15:27:29] local.ERROR: Operation timed out (30sec) {"exception":"[object] (HeadlessChromium\\Exception\\OperationTimedOut(code: 0): Operation timed out (30sec) at /Applications/XAMPP/xamppfiles/htdocs/sat/vendor/chrome-php/chrome/src/Utils.php:71)

・アクセス先のURL(route('question.result.html')の返り値): http://localhost:8000/question/result/pdf
こちらは正常で、アクセスしたいページです。

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

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

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

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

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

AbeTakashi

2022/06/06 06:19

Laravelがブロックしてるなら何かしらのログ(レスポンスコード403とか)が残っていると思います。WEBサーバのログ、Laravelで取ってるログは確認されたでしょうか? ログの内容を見ても分からないようであれば、そちらの内容も可能な限り質問文に追記してみてください。
phper.k

2022/06/06 06:27

$url = route('question.result.html'); ここで $url にどのような値が代入されているかご確認ください
sk_

2022/06/06 06:34

皆様ご指摘ありがとうございます。 ちなみにルーティングでは ->name('question.result.html') としております。 .htmlと拡張子のようで紛らわしいのですが、命名した名前になります。
退会済みユーザー

退会済みユーザー

2022/06/06 06:45

php artisan route:list コマンドを実行して、'question.result.html'として命名したルーティングが出てくるかを確認するとか。
sk_

2022/06/06 06:47

ありがとうございます。 ルーティング自体は問題なく行っており、ブラウザから直接叩けばHTMLが表示される状態です。 chromiumライブラリによるアクセスだけが到達できない形になっています
guest

回答1

0

アクセス先のURL(route('question.result.html')の返り値): http://localhost:8000/question/result/pdf
こちらは正常で、アクセスしたいページです。

これ正常ですかね?

$url = 'http://localhost:8001';

こっちでアクセスできるなら、ポートは 8001 でなければならないのでは?

投稿2022/06/06 06:42

phper.k

総合スコア3923

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

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

sk_

2022/06/06 06:45

ご回答ありがとうございます! 説明不足で申し訳ないのですが、 ローカルにアクセスすること自体ができないのか、 または自身(Laravel)にアクセスすることができないのかの切り分けのため、 ローカルホストの 8000番と8001番に別のサーバを建てました。 アクセス元は 8000番、アクセス先(別プロジェクト)は8001番という形でした
phper.k

2022/06/06 06:50 編集

> ローカルホストの 8000番と8001番に別のサーバを建てました。 どういった環境ですか? Dockerコンテナをそれぞれ二つたててあるとか、そういう意味での環境はどうなっているのですか?
sk_

2022/06/06 07:03

お時間いただきすみません。。ご質問ありがとうございます 具体的には、 本体であるLaravelプロジェクトのルートディレクトリにて php artisan serv --port=8000 テストプロジェクトのルートディレクトリにて php -S localhost:8001 どちらもビルトインサーバで立てているような状態かと思います。
phper.k

2022/06/06 08:50 編集

あーなるほどね まず、localhost の意味が分かっていないから、これでチェックできると思っているんですね。 A(8000) から B(8001)にアクセスしたい(逆も然り)のであれば、localhostではないです。 localhost とは1人称の「俺・私」と同じように、自分自身のサーバーを指しますので、AからAにアクセスしようとします。BからであればBにアクセスしようとします。 なので、Localhost ではなく、172.20.XX.XX のようなアドレスを指定しなければなりません また、PHPのビルトインサーバでは起動できるサーバーは一つだけ、後で起動したものが有効になり、最初に起動したものは、正常に動作しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問