ข้อความแสดงข้อผิดพลาด 500 โดยละเอียด, ASP + IIS 7.5


192

IIS 7.5, 2008rc2, asp ดั้งเดิม, 500 ข้อผิดพลาด msg:

ไม่สามารถแสดงหน้านี้ได้เนื่องจากมีข้อผิดพลาดภายในเซิร์ฟเวอร์เกิดขึ้น

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


ฉันใช้วิธีที่แตกต่างกันในการบันทึกข้อผิดพลาดในไฟล์ข้อความ: stackoverflow.com/questions/20475502/… ความแตกต่างที่สำคัญ - ข้อมูลข้อผิดพลาดจะถูกเก็บไว้ในไฟล์ข้อความ
Zam

คำตอบ:


231

ฉันได้มาปัญหาเดียวกันและคงที่เช่นเดียวกับอเล็กซ์ K

ดังนั้นหาก "ส่งข้อผิดพลาดไปยังเบราว์เซอร์" ไม่ทำงานให้ตั้งค่านี้:

หน้าข้อผิดพลาด -> 500 -> แก้ไขการตั้งค่าคุณสมบัติ -> "ข้อผิดพลาดโดยละเอียด"

ป้อนคำอธิบายรูปภาพที่นี่

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



3
หาก "หน้าข้อผิดพลาด" หายไปจากพาเนลของคุณให้เปิดใช้งานคุณสมบัติ: เปิดหรือปิดคุณสมบัติ Windows => บริการ WWW, คุณสมบัติ HTTP ทั่วไป, [x] ข้อผิดพลาด HTTP
fiat

1
@fiat เพื่อเปิดใช้งาน "Error Pages" ฉันต้องไป: Turn Windows features on or off > Internet Information Services > World Wide Web Services > Common HTTP Features > [✓] HTTP Errors.
Jess Telford

หมายเหตุ: "Error Pages"และ".NET Error Pages"แตกต่างกัน คุณต้องการ"หน้าข้อผิดพลาด"โดยเฉพาะ
Jess Telford

@JessTelford HOW-TOสำหรับหน้าแสดงข้อผิดพลาด NETหรือไม่
Kiquenet

94

หากคุณอยู่บนเซิร์ฟเวอร์ระยะไกลคุณสามารถกำหนดค่าไฟล์ web.config ดังนี้:

<configuration>
<system.webServer>
    <httpErrors errorMode="Detailed" />
    <asp scriptErrorSentToBrowser="true"/>
</system.webServer>
<system.web>
    <customErrors mode="Off"/>
    <compilation debug="true"/>
</system.web>


1
ที่จริงการ<system.webserver>ตั้งค่าก็เพียงพอแล้วในกรณีของฉันขอบคุณ
marapet

4
system.webServerส่วนจะถูกอ่านโดย IIS 7+ แม้ในขณะที่ทำงานคลาสสิก ASP
ทิมลูอิส

2
โหมด customErrors = "ปิด" ทำเพื่อฉัน
spankmaster79

ไม่จำเป็นต้องใช้อีกต่อไปcustomErrors(เช่นIIS 7+, ASP.NET, Classic AppPool ) tedgustaf.com/blog/2011/5/…
Kiquenet

49

คลิกสองครั้งที่ "ASP" ในหน้าจอหลักของไซต์ใน IIS admin ขยาย "คุณสมบัติการแก้ไขข้อบกพร่อง" เปิดใช้งาน "ส่งข้อผิดพลาดไปยังเบราว์เซอร์" และคลิก "ใช้"

ใต้ "หน้าข้อผิดพลาด" บนหน้าจอหลักให้เลือก "500" จากนั้น "แก้ไขการตั้งค่าคุณสมบัติ" และเลือก "ข้อผิดพลาดโดยละเอียด"

โปรดทราบว่าใช้ขั้นตอนเดียวกันสำหรับ IIS 8.0 (Windows Server 2012)


อาจนำไปใช้กับIIS 7.5, Windows 2008 R2, ASP.NET 4.5.1 (WebForms) กับ CLASSIC AppPool (ไม่รวม)
Kiquenet


20

ในweb.configภายใต้

<system.webServer>

แทนที่ (หรือเพิ่ม) บรรทัด

<httpErrors errorMode="Detailed"></httpErrors>

กับ

<httpErrors existingResponse="PassThrough" errorMode="Detailed"></httpErrors>

นี่เป็นเพราะโดยค่าเริ่มต้น IIS7 จะสกัดกั้นรหัสสถานะ HTTP เช่น 4xx และ 5xx ที่สร้างขึ้นโดยแอปพลิเคชันเพิ่มเติมไปป์ไลน์

ถัดไปเปิดใช้งาน " ส่งข้อผิดพลาดไปยังเบราว์เซอร์ " ภายใต้ส่วน "ASP" และภายใต้ " หน้าข้อผิดพลาด / แก้ไขการตั้งค่าคุณสมบัติ " เลือก "ข้อผิดพลาดโดยละเอียด"

นอกจากนี้ให้เขียนสิทธิ์บนโฟลเดอร์เว็บไซต์ให้กับกลุ่มIIS_IUSRS ในตัว


1
เพื่อให้เทียบเท่ากับผู้ใช้ power shell ให้รัน:Set-WebConfigurationProperty '/system.WebServer/httpErrors' -Name errorMode -Value Detailed
Blaskovicz

20

TLDR: ก่อนอื่นให้กำหนดว่าคุณจะได้รับข้อผิดพลาดจากที่ใด (เลื่อนดูภาพหน้าจอของสิ่งที่คล้ายกับข้อผิดพลาดของคุณ) ทำการเปลี่ยนแปลงเพื่อรับสิ่งใหม่ทำซ้ำ

ก่อนอื่นให้พิจารณาข้อความแสดงข้อผิดพลาดที่คุณเห็น

หากคุณเห็นไฟล์อยู่ที่นี่ ...

% SystemDrive% \ inetpub \ custerr \\ 500.htm

... ซึ่งโดยทั่วไปจะมีลักษณะเช่นนี้:

IIS 500 ผิดพลาด

... ถ้าอย่างนั้นคุณก็รู้ว่าคุณเห็นหน้าข้อผิดพลาดที่กำหนดค่าใน ** IIS ** และคุณไม่จำเป็นต้องเปลี่ยนการตั้งค่า ASP.net customErrors การตั้งค่ารายละเอียดข้อผิดพลาด asp หรือการตั้งค่าเบราว์เซอร์

คุณอาจต้องการดูเส้นทางอ้างอิงข้างต้นแทนที่จะไว้วางใจภาพหน้าจอของฉันในกรณีที่มีคนเปลี่ยนมัน

"ใช่ฉันเห็นข้อผิดพลาดที่อธิบายไว้ข้างต้น ... "

ในกรณีนี้คุณจะเห็นการตั้งค่า < httpErrors > หรือใน IIS Manager หน้าข้อผิดพลาด -> แก้ไขการตั้งค่าคุณสมบัติ ค่าเริ่มต้นสำหรับนี่คือ errorMode = DetailedLocalOnly ที่ระดับโหนดเซิร์ฟเวอร์ (ตรงข้ามกับระดับไซต์)ซึ่งหมายความว่าในขณะที่คุณจะเห็นหน้าข้อผิดพลาดที่กำหนดค่านี้ในขณะที่อยู่ห่างไกลคุณควรจะสามารถเข้าสู่ระบบในเซิร์ฟเวอร์และดูแบบเต็ม ข้อผิดพลาดซึ่งควรมีลักษณะดังนี้:

ข้อผิดพลาด HTTP โดยละเอียด

คุณควรมีทุกสิ่งที่คุณต้องการ ณ จุดนั้นเพื่อแก้ไขข้อผิดพลาดปัจจุบัน

"แต่ฉันไม่เห็นข้อผิดพลาดอย่างละเอียดแม้กระทั่งเรียกดูบนเซิร์ฟเวอร์"

นั่นทำให้ความเป็นไปได้สองสามอย่าง

  1. เบราว์เซอร์ที่คุณใช้บนเซิร์ฟเวอร์ได้รับการกำหนดค่าให้ใช้พร็อกซีในการตั้งค่าการเชื่อมต่อดังนั้นจึงไม่ถูกมองว่าเป็น "ท้องถิ่น"
  2. คุณไม่ได้ท่องไปยังไซต์ที่คุณคิดว่ากำลังเข้าชมซึ่งโดยทั่วไปจะเกิดขึ้นเมื่อมีการโหลดบาลานเซอร์ที่เกี่ยวข้อง ทำ ping check เพื่อดูว่า dns ให้ IP กับคุณบนเซิร์ฟเวอร์หรือที่อื่น ๆ
  3. คุณเป็นhttpErrorsของเว็บไซต์การตั้งค่าตั้งค่าเป็น "กำหนดเอง" เท่านั้น เปลี่ยนเป็น "DetailedLocalOnly" อย่างไรก็ตามหากคุณมีข้อผิดพลาดในการกำหนดค่าอาจไม่ทำงานเนื่องจาก httpErrors ระดับไซต์นั้นเป็นรายการการกำหนดค่าด้วย ในกรณีนั้นดำเนินการต่อไป # 4
  4. ค่าเริ่มต้นสำหรับhttpErrorsสำหรับทุกไซต์ถูกตั้งค่าเป็น "กำหนดเอง" ในกรณีนี้คุณต้องคลิกที่โหนดเซิร์ฟเวอร์ระดับบนสุดใน IIS Manager (และไม่ใช่เว็บไซต์ที่เฉพาะเจาะจง) และเปลี่ยนhttpErrorsตั้งค่านั่นเป็น DetailedLocalOnly หากนี่เป็นเซิร์ฟเวอร์ภายในและคุณไม่กังวลเกี่ยวกับการเปิดเผยข้อมูลที่ละเอียดอ่อนคุณสามารถตั้งค่าเป็น "ละเอียด" ซึ่งจะช่วยให้คุณเห็นข้อผิดพลาดจากไคลเอนต์อื่นที่ไม่ใช่เซิร์ฟเวอร์
  5. คุณไม่มีโมดูลบนเซิร์ฟเวอร์เช่น UrlRewrite (อันนี้กัดฉันมากและมักจะให้ข้อความทั่วไปโดยไม่คำนึงถึงการตั้งค่า httpErrors)

"การเข้าสู่เซิร์ฟเวอร์ไม่ใช่ตัวเลือกสำหรับฉัน"

เปลี่ยนhttpErrorsของเว็บไซต์เป็น"ละเอียด" เพื่อให้คุณเห็นได้จากระยะไกล แต่ถ้ามันไม่ทำงานข้อผิดพลาดของคุณอาจเป็นข้อผิดพลาดการตั้งค่าดู # 3 ทันทีด้านบน ดังนั้นคุณอาจติดกับ # 4 หรือ # 5 และคุณต้องการใครสักคนจากทีมเซิร์ฟเวอร์ของคุณ

"ฉันไม่เห็นหน้าข้อผิดพลาดที่อธิบายไว้ข้างต้นฉันเห็นสิ่งที่แตกต่าง"

ถ้าคุณเห็นสิ่งนี้ ...

ป้อนคำอธิบายรูปภาพที่นี่

... และคุณคาดหวังว่าจะเห็นอะไรเช่นนี้ ...

ป้อนคำอธิบายรูปภาพที่นี่

... จากนั้นคุณต้องเปลี่ยน "ส่งข้อผิดพลาดไปยังเบราว์เซอร์" เป็นจริงใน IIS Manager ภายใต้ไซต์ -> IIS -> ASP -> คุณสมบัติการตรวจแก้จุดบกพร่อง

ถ้าคุณเห็นสิ่งนี้ ...

ข้อผิดพลาดที่เป็นมิตรเช่น 1

หรือนี่ ...

ข้อผิดพลาดที่เป็นมิตรเช่น 2

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

ถ้าคุณเห็นสิ่งนี้ ...

เปิดใช้งานข้อผิดพลาดที่กำหนดเอง

... ดังนั้นข้อผิดพลาดที่กำหนดเองทำงาน แต่คุณไม่มีหน้าข้อผิดพลาดที่กำหนดเอง (แน่นอน ณ จุดนี้กำลังพูดถึง. net และไม่ใช่ asp ดั้งเดิม) คุณต้องเปลี่ยนแท็ก customErrors ใน web.config เป็น RemoteOnly เพื่อดูบนเซิร์ฟเวอร์หรือ Off เพื่อดูจากระยะไกล

หากคุณเห็นบางสิ่งที่มีลักษณะเหมือนไซต์ของคุณข้อผิดพลาดที่กำหนดเองน่าจะเป็น On หรือ RemoteOnly และแสดงหน้าเว็บที่กำหนดเอง (Views-> Shared-> Error.cshtml ใน MVC เป็นต้น) ที่กล่าวมาเป็นไปได้ยาก แต่มีความเป็นไปได้ที่มีคนเปลี่ยนหน้าใน IIS สำหรับ httpErrors ดังนั้นให้ดูหัวข้อแรกในส่วนนั้น


9

ลองตั้งค่าแอตทริบิวต์ httpErrors "ที่มีอยู่" เป็น "PassThrough" Mine ถูกตั้งค่าไว้ที่ "Replace" ซึ่งทำให้ YSOD ไม่แสดง

<httpErrors errorMode="Detailed" existingResponse="PassThrough">

2
customErrors สำหรับ asp.net httpErrors สำหรับ IIS7 และจัดการกับเนื้อหาที่ไม่ผ่านตัวจัดการ. net (เช่น. png, .js เป็นต้น) หากคุณต้องการหน้าข้อผิดพลาดสำหรับประเภทเนื้อหาที่ไม่ใช่. NET ให้ใช้หน้าข้อผิดพลาด IIS (httpErrors สำหรับ IIS7 UI สำหรับ IIS6.) แอตทริบิวต์ customErrors ใช้เมื่อรหัส. NET กำลังทำการยกเว้น (404, 403, 500 เป็นต้น) และแอตทริบิวต์ httpErrors จะใช้เมื่อ IIS เองกำลังทำการยกเว้น นี่เป็นเพราะโดยค่าเริ่มต้น IIS7 จะสกัดกั้นรหัสสถานะ HTTP เช่น 4xx และ 5xx ที่สร้างขึ้นโดยแอปพลิเคชันเพิ่มเติมไปป์ไลน์
Kiquenet

6

สิ่งหนึ่งที่ไม่มีใครพูดถึงคือการแก้ไขที่รวดเร็วและชั่วคราวมากคุณสามารถดูข้อผิดพลาดบน localhost ของเว็บเซิร์ฟเวอร์นั้น


1
นั่นคือถ้าตัวเลือกที่สามมองเห็นได้ในคำตอบของ Vaclavถูกเลือก
ricksmt

3

คุณอาจตรวจสอบว่าหากคุณเปลี่ยนโฟลเดอร์เว็บไซต์หลัก ( c:\inetpub\wwwroot) เป็นโฟลเดอร์อื่นคุณต้องให้สิทธิ์การอ่านแก่กลุ่ม IIS_IUSRSในโฟลเดอร์ใหม่


3

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


1

พบมัน

http://blogs.iis.net/ksingla/archive/2009/02/16/iis-7-5-updates-to-custom-errors-and-compression.aspx

เรียกใช้ cmd ในฐานะผู้ดูแลระบบไปที่โฟลเดอร์ system32 \ inetsrv ของคุณและดำเนินการ:

appcmd.exe set config -section:system.webServer/httpErrors -allowAbsolutePathsWhenDelegated:true

ตอนนี้ฉันเห็นข้อผิดพลาด asp โดยละเอียด


1

หากคุณเรียกใช้เบราว์เซอร์ในเซิร์ฟเวอร์และทดสอบ url ของโครงการด้วย IP ท้องถิ่นคุณได้รับข้อผิดพลาดทั้งหมดของโครงการโดยไม่มีหน้าข้อผิดพลาดโดยทั่วไป (ตัวอย่างเช่นหน้าข้อผิดพลาด 500)

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