IIS 7 में ASP MVC में परिणाम: HTTP त्रुटि 403.14 - निषिद्ध


146

मैं एक एएसपी एमवीसी वेब परियोजना विकसित कर रहा हूं। अब मेरे पास एक आवश्यकता है जो मुझे विकास की एक IIS7 बेदखल करने के लिए (कुछ सुविधाओं की जांच करने के लिए) तैनात करने के लिए मजबूर करती है। जब भी मैं वेब साइट का URL टाइप करने की कोशिश करता हूं तो मुझे उपर्युक्त त्रुटि संदेश मिल रहा है। (नोट: विकास मशीन: विस्टा होम प्रीमियम, IIS7)

मैंने अब तक क्या किया है:

HOSTS फ़ाइल को संपादित किया गया (C: \ WINDOWS \ system32 \ driver \ etc \ मेजबान)।

इसमें दो डोमेन डालें (127.0.0.1 domain1.com & 127.0.0.1 domain2.com)।

एक फ़ोल्डर बनाया c: \ websites \ dirOfApplication और इस फ़ोल्डर में Visual Studio 8 के भीतर से तैनात किया गया।

IIS7 में होस्ट नाम domain1.com और एप्लिकेशन फोल्डर के साथ एक नई साइट बनाई गई है।

वेब ब्राउज़र में पता domain1.com टाइप करने से उपरोक्त त्रुटि होती है (HTTP त्रुटि 403.14 - निषिद्ध - इस निर्देशिका की सामग्री को सूचीबद्ध नहीं करने के लिए वेब सर्वर कॉन्फ़िगर किया गया है।)

मुझे लगता है कि मुझे कुछ याद आ रहा है लेकिन पता नहीं क्या है! System.Web.Mvc, System.Web.Abstraction & System.Web फ़ाइलों की तैनाती करने की कोशिश की। जब भी मैं F5 को हिट करने और एप्लिकेशन को चलाने की कोशिश करता हूं, यह ठीक काम करता है!


जवाबों:


224

हो सकता है कि यह किसी के लिए उपयोगी हो: अपने ऐप को MVC 4 में .NET फ्रेमवर्क 4.5 के साथ बदलने और IIS 7.0 के साथ अपने सर्वर पर फ्रेमवर्क स्थापित करने के बाद मुझे प्रश्न में उल्लिखित समान 'निषिद्ध' त्रुटि का सामना करना पड़ा। मैंने ऊपर दिए गए सभी विकल्पों को बिना किसी लाभ के देखा, जब मैंने देखा

<system.webServer>
 <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

मेरे web.config से गायब था। इसे जोड़ने के बाद, सब कुछ काम किया। सरल, लेकिन अनदेखी करना आसान ...

संपादित करें:

बेशक उपरोक्त समाधान काम करेगा, लेकिन यह वास्तव में संसाधनों की बर्बादी है। मुझे लगता है कि टिप्पणी में क्रिस हेरिंग द्वारा बताए गए मार्ग मॉड्यूल को जोड़ना बेहतर है ।

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>

2
यह पता चला है कि जब मैंने एक NuGet पैकेज की स्थापना रद्द की, तो यह runAllManagedModulesForAllRequests="true"मेरे Web.config से हटा दिया । यह उल्लेख करने के लिए धन्यवाद, इससे पहले कि मैंने सारी रात यह जानने की कोशिश की।
Schmalls

3
यह!! Arrrrgh मैंने एक दिन बिताया / जब तक मुझे आपका जवाब नहीं मिला, तब तक मैं काम करने की कोशिश कर रहा था, धन्यवाद! क्या अजीब है कि यह मेरे स्थानीय मशीन पर IIS पर ठीक चलेगा, लेकिन उत्पादन बॉक्स पर नहीं और वे दोनों IIS7.5 चल रहे हैं
ग्लेन

1
वह यह था। कैसेट नुगेट अनइंस्टॉल कभी-कभी इसे हटा देता है। धन्यवाद।
ज़ाचरी स्कॉट

8
रूटिंग मॉड्यूल जोड़कर इस सेटिंग के उपयोग से बचने की कोशिश करें - britishdeveloper.co.uk/2010/06/…
क्रिस हेरिंग

6
मुझे उत्तर टिप्पणी पसंद है "शायद यह किसी के लिए उपयोगी है" ... योग्य ... लगता है कि यह लोगों के टन के लिए उपयोगी है, खुद को शामिल किया गया।
पॉल

126

यहाँ SO पर उत्तर दिया गया , प्रश्न: 403 - i77 पर मूल MVC 3 परिनियोजित पर निषिद्ध

भागो aspnet_regiis -i। अक्सर मैंने पाया है कि आपको काम करने के लिए 4.0 एप्लिकेशन प्राप्त करने की आवश्यकता है। कमांड प्रॉम्प्ट को एक के रूप में खोलें Administrator(कमांड प्रॉम्प्ट आइकन पर क्लिक करें और व्यवस्थापक के रूप में रन का चयन करें):

cd \
cd Windows\Microsoft.NET\Framework\v4.xxx.xxx
aspnet_regiis -i

एक बार जब यह स्थापित और पंजीकृत हो जाता है, तो सुनिश्चित करें कि आप अनुप्रयोग एक अनुप्रयोग पूल का उपयोग कर रहे हैं जो .NET 4.0 पर सेट है।

अद्यतन: मैं सिर्फ इस आदेश के साथ एक मुद्दा मिला। प्रयोग -i ने ASP.NET 4.0 में सभी एप्लिकेशन पूल को अपडेट किया।

aspnet_regiis -irASP.NET का संस्करण इंस्टॉल करने का उपयोग करता है, लेकिन इस संस्करण में कोई वेब एप्लिकेशन नहीं बदलता है। आप -iru विकल्प की समीक्षा भी करना चाह सकते हैं।


मेरे लिए भी काम किया। Aspnet_regiis -i कमांड UrlMappingModule चलाने के बाद IIS में स्थापित किया गया था।
मनीष गुप्ता

IIS स्थापित करने के बाद, मुझे सब कुछ काम करने के लिए aspnet_regiis चलाने की आवश्यकता थी, भले ही .NET 4 पहले से ही पंजीकृत दिखाई दे।
ब्रायन

यदि IIS से पहले ढांचा स्थापित किया गया था, तो हाँ आपको aspnet_regiis की आवश्यकता होगी।
ब्रेट्स्की

2
मत भूलो कि 64 बिट सिस्टम के लिए यह "फ्रेमवर्क 64" है। यानी, Windows \ Microsoft.NET \ Framework64 \ v4.xxx.xxx
grahamesd

इस उपयोग के लिए, aspnet_regiis का 64 या 32 बिट संस्करण कोई मायने नहीं रखता है। कुछ विशेष मामले यहां सूचीबद्ध हैं: msdn.microsoft.com/en-us/library/k6h9cz8h.aspx#Anchor_1
ब्रेटस्की

34

मैं भी इस त्रुटि में भाग गया। सभी कॉन्फ़िगरेशन और अनुमतियां सही थीं। लेकिन मैं Global.asax को सर्वर पर कॉपी करना भूल गया, और इसने 403 त्रुटि दी।


मेरे मामले में, मैंने इसे बिना किसी सूचना के माउस के साथ गलती से स्थानांतरित कर दिया था। धन्यवाद!
मैथियास लिकेगार्ड लोरेनजेन

सिर्फ 2 घंटे बर्बाद कर दिए क्योंकि मैंने अपने वेब दस्तावेज़ फ़ोल्डर को मिटा देने के बाद इस फ़ाइल को कॉपी करना अनदेखा कर दिया था!
स्टीवन स्‍पॉट

10

यह इस बात के कारण है कि आप (मेरे) क्या कर रहे हैं!

मेरी मशीन पर IIS 7 स्थापित है, लेकिन आवश्यक ASP.NET घटक (नियंत्रण कक्ष-> कार्यक्रम-> चालू / बंद-> ASP.NET) नहीं था।

तो इस स्थापित करने से समस्या हल हो गई


9

मेरी भी यही समस्या थी। इस Microsoft समर्थन आलेख ने इसे मेरे लिए निर्धारित किया है।
https://support.microsoft.com/en-us/help/2023146/mvc-2-and-asp.net-4-web-forms-applications-that-use-url-routing-might-return-http- 404-त्रुटियों-जब-वे-प्रयास करने वाली प्रक्रिया-extensionless-यूआरएल-ऑन-आईआईएस-7 और आईआईएस-7.5

विंडोज कंट्रोल पैनल "प्रोग्राम्स एंड फीचर्स" एप्लिकेशन के "टर्न विंडोज फीचर्स ऑन या ऑफ" डायलॉग बॉक्स में, निम्न चरण करें:

  1. निम्न नोड पर नेविगेट करें: इंटरनेट सूचना सेवाएँ -> वर्ल्ड वाइड वेब सेवाएँ -> सामान्य HTTP सुविधाएँ
  2. सुनिश्चित करें कि "HTTP त्रुटि पुनर्निर्देशन" विकल्प चुना गया है।

-या-

  1. निम्न नोड पर नेविगेट करें: इंटरनेट सूचना सेवाएँ -> वर्ल्ड वाइड वेब सेवाएँ -> प्रदर्शन सुविधाएँ
  2. सुनिश्चित करें कि "स्थैतिक सामग्री संपीड़न" विकल्प चुना गया है। विकल्प के चयन के बाद, परिवर्तनों को सहेजने के लिए "ओके" पर क्लिक करें।

HTTP त्रुटि पुनर्निर्देशन मॉड्यूल या स्टेटिक कंटेंट संपीड़न मॉड्यूल या तो पुनः सक्षम करना यह सुनिश्चित करता है कि ASP.NET और IIS HTTP पाइपलाइन घटनाओं को सही ढंग से सिंक्रनाइज़ करें। यह URL राउटिंग मॉड्यूल को एक्सटेंशन रहित URL को संसाधित करने में सक्षम बनाता है।


7

नीचे दी गई निम्न सेटिंग्स को लागू करने का प्रयास करें:

1)IIS_IUSRS उपयोगकर्ता को आवश्यक अनुमति दें IIS Server(वेब साइट पर राइट क्लिक करें फिर अनुमतियाँ संपादित करें> सुरक्षा)।

यहाँ छवि विवरण दर्ज करें

2) यदि आप उपयोग करते हैं .NET Framework 4, तो सुनिश्चित करें कि .NET फ्रेमवर्क संस्करण उस v4.0पर है Application Poolजो आपकी वेब साइट उपयोग करती है।

यहाँ छवि विवरण दर्ज करें

3) ओपन कॉमपैन प्रॉम्प्ट के रूप में administratorऔर iisresetपुनः आरंभ करने के लिए कमांड चलाएं IIS Server

उम्मीद है की यह मदद करेगा...


युक्ति: यदि आपको इसके बाद भी अनुमति त्रुटियां मिलती हैं तो आपको अपनी साइट को IIS में चलाने के लिए इसे करने के बाद cmd में iisreset करने की आवश्यकता हो सकती है।
कोरी कोच

6

मेरे मामले में निम्नलिखित दृष्टिकोण ने मेरी मदद की:

  1. aspnet_regiis -i में Windows\Microsoft.Net\Framework

  2. मॉड्यूल को system.webServer में जोड़ना

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        ...
    </system.webServer>

मैं अनुमान लगा रहा हूं कि आपने रूपरेखा को छोड़ दिया है। लेकिन व्यवस्थापक के रूप में cmd ​​खोलें, और Windows \ Microsoft.Net \ Framework \
v4.0.30319

5

कृपया यह भी जांच लें, यदि आप x64 चला रहे हैं, कि आपने ऐप पूल सेटिंग में 32-बिट एप्लिकेशन सक्षम किए हैं

यहाँ छवि विवरण दर्ज करें


3

पर सही का निशान हटाएँ "precompile प्रकाशन के दौरान" - मैं हो रही थी 403.14 एक वेब सेवा मैं सिर्फ VS2015 में लिखा था तो मैं VS2013 में यह दुबारा लिखा पर त्रुटि और एक ही त्रुटि हो रही थी। दोनों मामलों में मेरे पास "प्रकाशन के दौरान Precompile" था। मैंने इसे अनियंत्रित कर दिया लेकिन फिर भी त्रुटि हो रही थी। मेरे मामले में मेरे पास " प्रकाशित होने से पहले सभी मौजूदा फ़ाइलों को हटाएं " था, लेकिन वहां नई प्रकाशित फ़ाइलों की प्रतिलिपि बनाने से पहले सर्वर पर लक्ष्य निर्देशिका से सब कुछ हटा नहीं रहा था। यदि आप ऐसा नहीं करते हैं - एक " PrecompiledApp.config " फ़ाइल पीछे रह जाती है जो समस्या का कारण बनती है। एक बार जब मैंने उस फाइल को डिलीट कर दिया, तो मैं अपनी वेब सेवा के वीएस २०१३ और वीएस २०१५ संस्करणों पर सुनहरा था।


2

मैंने यहाँ सब कुछ करने की कोशिश की; कुछ भी काम नहीं किया। समस्या मेरे में था Web.configफ़ाइल निर्भर बाध्यकारी न्यूनतम से बदल गया विधानसभा, किसी भी तरह 1कम से कम करने के लिए 0

<!-- was -->
<runtime>
    <assemblyBinding>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" />
                <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />


<!-- should have been -->
                <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />

1

कृपया ध्यान दें कभी-कभी गलत Managed pipeline modeइस त्रुटि का कारण होगा। चयन करने के लिए दो विकल्प हैं integratedऔर classic


1

"HTTP त्रुटि 403.14" कैसे ठीक करें - निषिद्ध वेब सर्वर इस निर्देशिका की सामग्री को सूचीबद्ध नहीं करने के लिए कॉन्फ़िगर किया गया है "

यह त्रुटि तब होती है जब आपके पास MVC 2+ IIS 7+ पर होस्ट किया जाता है, ऐसा इसलिए है क्योंकि ASP.NET 4 IIS में पंजीकृत नहीं था। मेरे मामले में मैं MVC 3 प्रोजेक्ट बना रहा था और इसे IIS 7.5 पर होस्ट कर रहा था।

इसे ठीक करने के लिए, सुनिश्चित करें कि आपके पास MVC 2 या इसके बाद का संस्करण है और .Net फ्रेमवर्क 4.0 स्थापित है, फिर प्रशासक के रूप में कमांड प्रॉम्प्ट चलाएँ और निम्न पंक्ति टाइप करें:

32 बिट (x86)

% विंडीर% \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_regiis.exe -ir

64 बिट (x64)

% विंडीर% \ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet_regiis.exe -ir


1

अपनी Global.asax फ़ाइल की जाँच करें । मेरे मामले में, यह खाली था।


1

यदि शीर्ष उत्तर काम नहीं करते हैं, PrecompiledApp.configतो होस्टिंग निर्देशिका में नामांकित एक कॉन्फ़िगरेशन देखें और मौजूद होने पर उसे हटा दें। यह फ़ाइल IISExpress और LocalIIS को ठीक से काम करने से रोकती है। (और मुझे लगता है कि यह एक बग है) मेरे मामले में फ़ाइल की सामग्री थी:

<precompiledApp version="2" updatable="true"/>

और मैं 100% सकारात्मक हूं जो मेरे मामले में समस्या थी क्योंकि मैंने 2 घंटे में सब कुछ करने की कोशिश की और इस कॉन्फ़िगरेशन के साथ बहुत बार परीक्षण किया।

एक और बात: आप aspnet_regiisWindows और IIS के नए संस्करणों में उपयोग नहीं कर सकते हैं इसलिए प्रयास करें

dism /online /enable-feature /featurename:IIS-ASPNET45 /all


0

निम्न कारणों से सभी प्रदान किए गए समाधानों के बावजूद मुझे भी यही त्रुटि आई है:

  • गुम DLLs
  • डेटाबेस कनेक्शन स्ट्रिंग एक दुर्गम सर्वर पर इंगित करता है।

0

मेरे मामले में web.config और / बिन फ़ोल्डर को छोड़कर सभी फाइलें गायब थीं (किसी भी तरह कॉपी नहीं की गईं)।
मूर्खतापूर्ण, लेकिन वह आखिरी चीज थी जिसे मैंने जांचा है।


0

मुझे हाल ही में यह त्रुटि आई थी और पाया कि समस्या "HTTP पुनर्निर्देशन" फीचर के कारण थी जो मेरे विंडोज सर्वर पर सक्षम नहीं थी। इस ब्लॉग पोस्ट ने उत्तर खोजने में समस्या निवारण के माध्यम से मुझे मदद की (पुराने विंडोज सर्वर संस्करणों के बावजूद): http://blogs.msdn.com/b/rjacobs/archive/2010/06/30/system-web-rout-routetable -नोट वर्किंग-विद-आईस.स्पेक्स नए सर्वरों के लिए कंप्यूटर प्रबंधन में जाते हैं, फिर वेब सर्वर भूमिका पर स्क्रॉल करें और क्लिक करेंadd role services


0

ASP.NET परियोजना के साथ C # 4.5 के साथ मैंने वेब प्लेटफ़ॉर्म इंस्टालर में ASP.NET एक्सटेंशन स्थापित करके ऐसी समस्या को हल किया है


0

साथ ही एक और चीज संभव हो सकती है

मैन्युअल रूप से .net फ्रेमवर्क 4.0 स्थापित करें

यह समाधान विंडो 7 पर IIS7 के लिए है

प्रशासन के साथ खुला cmd प्रबल करता है

निर्देशिका "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319" पर जाएं

टाइप करें aspnet_regiis.exe -i

"inetmgr" रन कमांड में टाइप करके अपने इनसेट मैनेजर को मिल गया

अपने IIS7 को ताज़ा करें

साइट को फिर से लोड करें।


0

मुझे पता है कि आपको आंतरिक मेजबान में यह समस्या थी, लेकिन मैंने बाहरी मेजबान में पहले भी इस तरह के मुद्दे का अनुभव किया था और मेरे मामले में इसका स्वयं का संकल्प था, शायद यह किसी के समय को बचा सके:

वास्तव में मेरी वेबसाइट को किसी कारण से रोक दिया गया था, जिसके बारे में मुझे वर्तमान में जानकारी नहीं है, यह देखने के लिए कि क्या आपके पास भी यही समस्या है, वेबसाइटपैनियल मुख्य पृष्ठ में वेब पर जाएं -> वेबसाइट तब सूची से अपनी वेबसाइट का डोमेन नाम चुनें , उसके बाद पृष्ठ के दाईं ओर केवल खोला गया, जाँचें कि क्या आपको शब्द STARTED दिखाई दे रहा है, अन्यथा यदि आप STOPPED शब्द देखते हैं, तो इसे फिर से शुरू करें। बस इतना ही।


0

मुझे पता है कि यह एक पुराना विषय है, लेकिन आपको यह त्रुटि तब भी हो सकती है (जब आप डीबगिंग कर रहे हों) यदि आपके पास नियंत्रक में मार्ग के समान फ़ोल्डर हो।

उदाहरण के लिए, यदि आपके पास एक UserController है, जिसका मार्ग / उपयोगकर्ता है और आपको ALSO में "उपयोगकर्ता" नामक समाधान में एक फ़ोल्डर है, तो IISExpress आपके दृश्य को दिखाने के बजाय फ़ोल्डर को ब्राउज़ करने का प्रयास करेगा।


0

यहाँ सुझाए गए हर समाधान को आज़माने के बाद, मुझे अभी तक एक और संभावित समाधान मिल गया है: URLScan

IIS ने WebDAV को अक्षम कर दिया था, यहां तक ​​कि मेरे आवेदन के web.config में भी WebDAV के हैंडलर और मॉड्यूल को हटा दिया गया था। PUTs ने अभी भी एक 403 लौटाया है - IIS लॉग में बिना किसी लॉग एंट्री के निषिद्ध । (GET / POST ने ठीक काम किया)।

पता चला कि IIS में एक सक्रिय ISAPI फ़िल्टर (URLScan) था, जिसने सभी PUT को रोका। URLScan को हटाने के बाद, इसने मेरे लिए काम किया।


0

मेरी स्थिति इनमें से किसी से भी पूरी तरह से अलग थी और 403: निषिद्ध त्रुटि संदेश एक लाल हेरिंग का थोड़ा सा था।

यदि Global.asax मॉड्यूल में आपका Application_Start () फ़ंक्शन web.config और एक प्रविष्टि का उपयोग करने की कोशिश करता है, जो इसमें नहीं है, तो IIS चोक है और (किसी कारण से) 403: निषिद्ध त्रुटि संदेश फेंकता है।

यह जांचें कि आप web.config फ़ाइल में कोई प्रविष्टि नहीं खो रहे हैं जो आपके Global.asax मॉड्यूल में एक्सेस करने का प्रयास कर रही है।


0

यदि आप मेरे जैसे हैं और आपके पास NHibernate का उपयोग करने वाला एक आवेदन है और उपरोक्त उत्तरों से आपकी समस्या हल नहीं हुई है।

आपको अपने आवेदन में कनेक्शन स्ट्रिंग को देखना चाहिए; यह सुनिश्चित करने के लिए webconfig फ़ाइल में संभवतः सही है।


-1

मैं पहचान प्रतिरूपण का उपयोग कर रहा हूं:

<system.web>
    <identity impersonate="true" userName="domain\username" password="password"/>
</system.Web>

सर्वर पर धकेलने पर आपको उपयोगकर्ता नाम Temporary ASP.NETफ़ाइल फ़ोल्डर तक पहुँच देना होगा ताकि वह ठीक से पढ़ / लिख / निष्पादित कर सके:

C:\Windows\Microsoft.NET\"frameworkversion"\"aspversion"\Temporary ASP.NET Files

स्पष्ट रूप से आपके द्वारा उपयोग किए जा रहे संस्करणों के साथ "फ्रेमवर्क" और "एस्पर्वेशन" को बदलें।


-1

चरण 1: उस साइट का चयन करें जिसके लिए IIS में HTTP त्रुटि उत्पन्न हुई है और फिर नीचे दी गई छवि में दिखाए अनुसार निर्देशिका ब्राउज़िंग पर क्लिक करें:

चरण 2: IIS में डायरेक्टरी ब्राउजिंग विंडो में दाईं ओर दिए गए वर्णों में सक्षम करें पर क्लिक करें जैसा कि नीचे चित्र में दिखाया गया है:

अब निर्देशिका ब्राउज़िंग आपकी asp.net वेबसाइट के लिए सक्षम है, बस IIS में वेब एप्लिकेशन को पुनरारंभ करें और अपने ब्राउज़र में साइट ब्राउज़ करें और परिणाम देखें।


-1

मैं उपयोग कर रहा हूँ: विन सर्वर 2012 R2 / IIS 8.5 / MVC4 / .net 4.5

यदि उपरोक्त में से कोई भी काम नहीं किया है तो यह प्रयास करें:

प्रकाशन के दौरान "Precompile" को अनचेक करें

यह कुछ दिनों के लिए मेरे बट लात मारी।


@ d-kermott, हो सकता है कि मेरी [खोज] [( stackoverflow.com/a/31319136/912481 ) आपके लिए भी उपयोगी हो?
कामिल ग्रीव

-1

मेरे पास यह समस्या थी लेकिन यह इंटरनेट सूचना सेवा (IIS) प्रबंधक पर जाकर, डायरेक्ट्री ब्राउजिंग पर डबल क्लिक करके और सक्षम पर क्लिक करके आसानी से तय हो गई थी।

मेरे मामले में, मैं फ़ाइलों को सीधे एक्सेस कर सकता था लेकिन फ़ोल्डरों तक नहीं पहुंच सकता था।


-1

मैंने आईपी पते को एक अंक से गलत कर दिया था, जिसका मतलब था कि यह मेरे अन्य सर्वरों में से एक में जा रहा था। बहुत ही भ्रामक है क्योंकि आपको .NET त्रुटि पेज मिलता है लेकिन गलत मशीन से!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.