เกิดข้อผิดพลาดในตัวจัดการข้อยกเว้น - ลาราเวล


118

เป็นคำถามเกี่ยวกับการติดตั้ง Laravel ฉันมีการตั้งค่าเซิร์ฟเวอร์ Unix แบบสาธารณะ:

<VirtualHost *:80>
ServerAdmin webmaster@mydomain.org
DocumentRoot "/var/www/mydomain"
ServerName mydomain.org
ServerAlias www.mydomain.org
ErrorLog "/var/log/mydomain.org-error_log"
CustomLog "/var/log/mydomain.org-access_log" common
</VirtualHost>

ฉันสามารถให้บริการเอกสารที่ดีจาก / var / www / mydomain เช่นhttp://mydomain.org/test.phpด้วย test.php ที่ประกอบด้วย:

<?php echo 'test';

ใช้งานได้ดี

ในการทุบตีด้วย Laravel ที่ติดตั้งผ่าน Composer และดูไฟล์:

# ls /var/www/mydomain/my-laravel-project

.gitattributes  CONTRIBUTING.md artisan         composer.json   phpunit.xml readme.md       vendor
.gitignore      app             bootstrap       composer.lock   public          server.php

ดังนั้นเมื่อฉันเรียกดู:

http://mydomain.org/my-laravel-project/public/

ทำไมใบสมัครของฉันจึงรายงาน:

Error in exception handler. 

ในเบราว์เซอร์ - บนหน้าจอว่างเปล่าสีขาว? ฉันคาดหวังว่าจะได้เห็นหน้าจอสแปลชของ Laravel

ยิ่งไปกว่านั้นไฟล์บันทึกก็ไม่เปิดเผยอะไรเช่นกัน


เวอร์ชัน PHP? คุณสามารถตรวจสอบเซิร์ฟเวอร์ของคุณเข้าสู่ระบบ/var/logและดูว่ามีอะไรจะพูดหรือไม่
Jason Lewis

3
สิ่งที่เกี่ยวกับข้อผิดพลาดในการเข้าสู่ระบบของ Laravel app/storage/logs? และไดเร็กทอรีพื้นที่เก็บข้อมูลทั้งหมดสามารถเขียนได้หรือไม่?
Jason Lewis

1
@ Jason เหมือนที่คุณพูด - มันเป็นไดเร็กทอรีการจัดเก็บข้อมูล chmod -R 757 บนที่เก็บข้อมูลและฉันสามารถตีหน้าจอเริ่มต้นได้ +1 และขอบคุณ
คุกกี้

คำตอบ:


246

ตัวเลือกที่ปลอดภัยกว่าคือการเปลี่ยนกลุ่มของไดเร็กทอรีพื้นที่เก็บข้อมูลเป็นกลุ่มเว็บเซิร์ฟเวอร์ของคุณ (โดยปกติapacheหรือwww-dataแต่อาจแตกต่างกันไปตามระบบปฏิบัติการต่างๆ) และคงสิทธิ์ตามไดเร็กทอรี775ไว้

chgrp -R www-data app/storage

หรือด้วยchown.

chown -R :www-data app/storage

775แล้วให้แน่ใจว่ามีสิทธิ์ directory

chmod -R 775 app/storage

จากเว็บไซต์ Laravel :

Laravel อาจต้องการการอนุญาตชุดเดียวในการกำหนดค่า: โฟลเดอร์ภายในแอพ / ที่เก็บข้อมูลต้องการการเข้าถึงการเขียนโดยเว็บเซิร์ฟเวอร์


14
โดยทั่วไปจะปลอดภัยกว่าในการเปลี่ยนเจ้าของกลุ่มเป็นเว็บเซิร์ฟเวอร์และไม่อนุญาตให้ "โลก" เข้าถึงไฟล์ของคุณอย่างเต็มที่ 775 เป็นค่าเริ่มต้นสำหรับไดเรกทอรีดังนั้นจึงควรเพียงพอ chgrp -R apache app / storage
hlev

5
บน Mac คำสั่งข้างต้นไม่ทำงาน อย่างไรก็ตามคำสั่งนี้ทำ: sudo chown -R _www app/storage(แทนที่ _www ด้วยชื่อเซิร์ฟเวอร์ Apache ของคุณหากจำเป็น)
Leo Galleguillos

4
จากนั้นฉันต้องอนุญาตให้กลุ่มเขียน :chmod -R g+w app/storage
Daniel AA Pelsmaeker

ขอบคุณฉันพบว่าสิ่งนี้มีประโยชน์ แต่ในภายหลังจะสร้างปัญหาเมื่อคุณพยายามเรียกใช้ 'php artisan migrate ... ' - เนื่องจากโฟลเดอร์ '/ app / storage /' ให้ข้อผิดพลาด 'Permission Denied' - และคุณจะแก้ไขการอนุญาตทั้งหมดให้กับเจ้าของ "www-data" จนกว่าคุณจะไปถึงข้อผิดพลาดสิทธิ์ "/bootstrap/compiled.php" เป็นความคิดที่ดีที่จะตั้งค่านั้นเช่นกันเป็นเจ้าของ "www-data" หรือตั้งค่าทั้งหมดเป็น 0777
peedeeaay

3
(y) ขอบคุณการเปลี่ยนแปลง! chmod 777 ทำลายชีวิตเด็ก ๆ ในวัยเด็กจำนวนมาก :)
MA Hossain Tonu

17

ลาราเวล 5.2

ที่เก็บข้อมูล chmod -R 777

Laravel รุ่นเก่า chmod 777 app / storage / *

โปรดทราบว่าคุณมีเซิร์ฟเวอร์เฉพาะที่ถูกล็อกไว้อย่างสมเหตุสมผลโดยไม่มีบัญชีผู้ใช้อื่นนอกจากของคุณเอง 777 ไม่ควรเสี่ยงต่อความปลอดภัยมากกว่าสิ่งอื่นใด จะต้องมีช่องโหว่อื่น ๆ สำหรับผู้ใช้ที่ประสงค์ร้ายเพื่อใช้ประโยชน์จากสิ่งนั้นและ ณ จุดนั้นการอนุญาต 777 ก็น่าจะเป็นที่สงสัยอยู่ดี อย่างไรก็ตามหากคุณอยู่บนเซิร์ฟเวอร์ที่ใช้ร่วมกันกับผู้ใช้รายอื่นที่คุณไม่เชื่อถือคุณจะต้องพิจารณาการอนุญาตที่ซับซ้อนมากขึ้นหรือตรวจสอบว่าผู้ให้บริการโฮสติ้งของคุณได้ให้การแยกไว้หรือไม่

พวกเขาควรใส่ไว้ในเอกสารเริ่มต้นอย่างรวดเร็วและให้ตัวอย่างสำหรับการตั้งค่าต่างๆ คุณอาจต้องเรียกใช้อีกครั้งหลังจากโหลดครั้งแรกเนื่องจากมีการสร้างไดเรกทอรีเพิ่มเติมโดยอัตโนมัติ ดูในบันทึกของคุณเพื่อหาข้อผิดพลาดในการเขียน

นอกจากนี้ DocumentRoot ของคุณควรเป็น / path / to / laravel-project / public


4
เห็นด้วยหรือดีกว่ายังคงเป็นข้อความแสดงข้อผิดพลาดที่ละเอียดกว่า
homerjam

3
พวกเขาไม่ควรบอกให้คุณไปที่ www.domain.com/project/public เพราะนั่นไม่ใช่วิธีที่ถูกต้องในการเรียกใช้แอปพลิเคชัน Laravel คุณควรตั้งค่าเว็บเซิร์ฟเวอร์ของคุณเพื่อให้บริการสาธารณะ / * และไม่มีอะไรเพิ่มเติมโดย public / index.php เป็นจุดเข้าใช้งานเดียวสำหรับแอปพลิเคชันทั้งหมด คุณสามารถทำได้อย่างง่ายดายด้วย Apache; หากคุณใช้ nginx คุณอาจรู้ว่าคุณกำลังทำอะไรอยู่ และหากคุณใช้โฮสต์ cPanel ราคาถูก (ขอแสดงความเสียใจด้วย) การตั้งค่ารูทเว็บให้ชี้สู่สาธารณะได้อย่างง่ายดาย
เช้า

11
อย่างจริงจังที่แนะนำ 777 เป็นเพียงการละเมิดหลักการรักษาความปลอดภัยที่ชัดเจนที่สุด ...
ftrotter

1
ฉันรู้ว่ามันอายุหนึ่งปีแล้ว แต่ 777 เป็นวิธีที่แย่ที่สุดในการทำเช่นนี้ซึ่งทำลายกฎความปลอดภัยทั้งหมดอย่างที่ @ftrotter กล่าว
Zac Grierson


1

bandwagon ได้ส่งต่อเรื่องนี้มานานแล้ว แต่ฉันยังมีคำแนะนำอีกชิ้นหนึ่งเกี่ยวกับ "Error in exception handler"

ฉันเคยเกิดเหตุการณ์นี้ขึ้นกับฉันเมื่อฉันเรียกใช้ "php artisan" ซึ่งเป็นวิธีที่ดีในการประเมินว่าสภาพแวดล้อมของคุณทำงานโดยทั่วไปหรือไม่

ฉันรันมันและให้ข้อผิดพลาดนั้นแก่ฉันและฉันไม่สามารถระบุปัญหาได้จนกว่าฉันจะแก้ไขไฟล์ช่างฝีมือในไดเรกทอรีรากของโครงการของฉันและเพิ่มคำสั่ง try catch:

try {
    $artisan = Illuminate\Console\Application::start($app);
}
catch (Exception $e)
{
    dd($e->getMessage());
}

ณ จุดนั้นในที่สุดฉันก็เห็นข้อความที่ให้ความกระจ่าง:

string(41) "Connection refused [tcp://127.0.0.1:6379]"

ซึ่งในกรณีของฉันเป็นการกำหนดค่า redis ที่ไม่ดี แต่ในกรณีของคุณอาจเป็นอะไรก็ได้

ฉันหวังว่านี่จะช่วยใครสักคนหรืออย่างน้อยครั้งต่อไปที่ฉันมาที่นี่ฉันจะพบคำตอบของตัวเอง


ขอบคุณ ฉันพบปัญหาของฉันโดยใช้สิ่งนี้ - พิมพ์ออกcould not find driverมา แล้วฉันก็พบว่าฉันได้ติดตั้งphp-mysqlแล้วในขณะที่php7.0-mysqlจำเป็น ลิงค์นี้ช่วยฉันด้วย - digitalocean.com/community/tutorials/…
Udayraj Deshmukh

0

วิธีที่สั้นที่สุดในการแก้ปัญหานี้คือการเริ่มต้นช่างฝีมือด้วย sudo สิ่งนี้จะให้สิทธิ์ทั้งหมดแก่ช่างที่ต้องการและจะไม่ทำให้เกิดปัญหาด้านความปลอดภัยอีกด้วย

ดังนั้นแทนที่จะเริ่มให้บริการช่างฝีมือด้วย:

$ php artisan serve

ลองใช้:

$ sudo php artisan serve 

ดังนั้นคุณจะไม่ต้องทำการเปลี่ยนแปลงการอนุญาตใด ๆ


-5

ฉันมีปัญหาเดียวกันฉันเพิ่งเปลี่ยนการอนุญาตจากแอพไดเรกทอรี / ที่เก็บข้อมูลเป็น 775 ด้วยบรรทัดคำสั่ง chmod


5
สิ่งนี้ได้ระบุไว้แล้วในคำตอบที่ยอมรับในปัจจุบัน (และต้องการข้อมูลจากคำตอบนั้นเกี่ยวกับการตั้งค่ากลุ่มของไดเรกทอรีให้เป็นคำตอบที่ถูกต้องอย่างสมบูรณ์)
Matt Gibson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.