S3 स्टेटिक वेबसाइट होस्टिंग रूट सभी मार्गों को Index.html पर ले जाता है


250

मैं एक जावास्क्रिप्ट ऐप को होस्ट करने के लिए S3 का उपयोग कर रहा हूं जो HTML5 पुशस्टेट्स का उपयोग करेगा। समस्या यह है कि यदि उपयोगकर्ता किसी भी URL को बुकमार्क करता है, तो वह कुछ भी हल नहीं करेगा। मुझे जो कुछ भी चाहिए वह सभी यूआरएल अनुरोधों को लेने की क्षमता है और रूट एसडब्लू। Html को मेरी एस 3 बाल्टी में सेवा करने के बजाय, केवल एक पूर्ण रीडायरेक्ट करने की आवश्यकता है। तब मेरा जावास्क्रिप्ट एप्लिकेशन URL को पार्स कर सकता है और उचित पृष्ठ की सेवा कर सकता है।

क्या S3 को Redirect करने के बजाय सभी URL अनुरोधों के लिए index.html को बताने का कोई तरीका है? यह इस तरह के रूप में एक ही index.html की सेवा करके आने वाले सभी अनुरोधों को संभालने के लिए अपाचे स्थापित करने के समान होगा: https://stackoverflow.com/a/10647521/1762614 । मैं वास्तव में इन मार्गों को संभालने के लिए एक वेब सर्वर चलाने से बचना चाहूंगा। S3 से सब कुछ करना बहुत आकर्षक है।


क्या आपको इसका हल मिला?
w2lame

जवाबों:


302

CloudFront की मदद से url हैक्स के बिना इसे हल करना बहुत आसान है।

  • उदाहरण के लिए, S3 बाल्टी बनाएँ: प्रतिक्रिया
  • इन सेटिंग्स के साथ CloudFront वितरण बनाएँ:
    • डिफ़ॉल्ट रूट ऑब्जेक्ट : index.html
    • मूल डोमेन नाम : S3 बाल्टी डोमेन, उदाहरण के लिए: react.s3.amazonaws.com
  • त्रुटि पृष्ठ टैब पर जाएं , कस्टम त्रुटि प्रतिक्रिया बनाएँ पर क्लिक करें :
    • HTTP त्रुटि कोड : 403: निषिद्ध (404: एस 3 स्टेटिक वेबसाइट के मामले में नहीं मिला)
    • त्रुटि प्रतिक्रिया अनुकूलित करें : हाँ
    • प्रतिक्रिया पृष्ठ पथ : /index.html
    • HTTP रिस्पांस कोड : 200: ठीक है
    • क्रिएट पर क्लिक करें

8
धन्यवाद। अब तक का सबसे अच्छा जवाब।
jgb

और क्या इतना स्पष्ट नहीं है कि आप स्थान रखें ताकि आप "प्राकृतिक" रूटिंग कर सकें।
लुकाज़ मारेक सेल्स्की

5
यह मेरे लिए एक आकर्षण की तरह काम करता था, केवल कस्टम त्रुटि कोड जो मुझे चाहिए था वह 404 था, 403 नहीं
जेरेमी एस।

4
हैक का एक सा है, लेकिन महान काम करता है :) यह अच्छा होगा अगर CloudFront अभी हमें S3 फ़ाइल (बिना रीडायरेक्ट) के पथ की एक श्रृंखला को मैप करने दे।
बॉब

3
यह मेरे लिए काम नहीं कर रहा है। यह समाधान हमेशा होम पेज पर रीडायरेक्ट करता है न कि सही पेज ...
जिम

201

जिस तरह से मैं काम करने में सक्षम था वह इस प्रकार है:

अपने डोमेन के लिए S3 कंसोल के संपादन पुनर्निर्देशन नियम अनुभाग में, निम्नलिखित नियम जोड़ें:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <HostName>yourdomainname.com</HostName>
      <ReplaceKeyPrefixWith>#!/</ReplaceKeyPrefixWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>

यह उन सभी रास्तों को पुनर्निर्देशित करेगा जिनके परिणामस्वरूप 404 आपके रूट डोमेन को पथ के हैश-बैंग संस्करण के साथ नहीं मिला। तो http://yourdomainname.com/posts पर रीडायरेक्ट करेगा http://yourdomainname.com/#!/posts प्रदान की / पदों में कोई फ़ाइल नहीं है।

हालांकि एचटीएमएल 5 पुशस्टेट्स का उपयोग करने के लिए, हमें यह अनुरोध करने की आवश्यकता है और मैन्युअल रूप से हैश-बैंग पथ के आधार पर उचित पुशस्टैट स्थापित करना होगा। इसलिए इसे अपनी index.html फ़ाइल के शीर्ष पर जोड़ें:

<script>
  history.pushState({}, "entry page", location.hash.substring(1));
</script>

यह हैश पकड़ लेता है और इसे HTML5 पुशस्टेट में बदल देता है। इस बिंदु से आप अपने ऐप में नॉन-हैश-बैंग रास्तों के लिए पुशस्टेट्स का उपयोग कर सकते हैं।


4
यह समाधान महान काम करता है! यदि HTML मोड को कॉन्फ़िगर किया गया है तो वास्तव में कोणीयज स्वचालित रूप से इतिहास को आगे बढ़ाएंगे।
wcandillon

1
यह IE के पुराने संस्करण के साथ विफल हो जाएगा यदि आपके पास अपने यूआरएल में शामिल GET params है, सही है? आप उस मुद्दे के आसपास कैसे पहुँचते हैं?
clexmond

3
धन्यवाद! इसने मेरे लिए एक छोटे से ट्वीक के साथ बैकबोन पर अच्छा काम किया। मैंने पुराने ब्राउज़रों के लिए एक चेक में जोड़ा: <script language="javascript"> if (typeof(window.history.pushState) == 'function') { window.history.pushState(null, "Site Name", window.location.hash.substring(2)); } else { window.location.hash = window.location.hash.substring(2); } </script>
AE ग्रे

10
react-routerHTML5 pushStates और<ReplaceKeyPrefixWith>#/</ReplaceKeyPrefixWith>
Felix D.

5
यह काम नहीं करता सफारी और तैनाती की रणनीति के साथ एक बड़ी समस्या है। पुनर्निर्देशित करने के लिए एक छोटा सा js लिखना एक प्रकार का जर्जर दृष्टिकोण है। साथ ही, रीडायरेक्ट की संख्या भी एक समस्या है। मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या सभी S3 यूआरएल के लिए हमेशा index.html को इंगित करने का एक तरीका है।
moha297

129

दूसरों द्वारा उल्लिखित S3 / रीडायरेक्ट आधारित दृष्टिकोण के साथ कुछ समस्याएं हैं।

  1. आपके ऐप के पथ हल होते ही Mutliple रीडायरेक्ट होते हैं। उदाहरण के लिए: www.myapp.com/path/for/test को www.myapp.com/#/path/for/test के रूप में पुनर्निर्देशित किया जाता है
  2. उराल बार में एक झिलमिलाहट होती है क्योंकि 'एसपीए' आपके एसपीए ढांचे की कार्रवाई के कारण आती है और जाती है।
  3. एसईओ प्रभावित है क्योंकि - 'अरे! इसके गूगल ने रीडायरेक्ट पर अपना हाथ मजबूर कर दिया '
  4. आपके ऐप के लिए सफारी समर्थन एक टॉस के लिए जाता है।

समाधान है:

  1. सुनिश्चित करें कि आपके पास अपनी वेबसाइट के लिए अनुक्रमणिका मार्ग कॉन्फ़िगर है। अधिकतर यह index.html है
  2. S3 कॉन्फ़िगरेशन से रूटिंग नियम निकालें
  3. अपने S3 बाल्टी के सामने एक Cloudfront रखो।
  4. अपने क्लाउडफ्रंट उदाहरण के लिए त्रुटि पृष्ठ नियम कॉन्फ़िगर करें। त्रुटि नियमों में निर्दिष्ट करें:

    • Http त्रुटि कोड: 404 (और 403 या आवश्यकता के अनुसार अन्य त्रुटियां)
    • न्यूनतम TTL (सेकंड) कैशिंग में त्रुटि: 0
    • प्रतिक्रिया अनुकूलित करें: हाँ
    • प्रतिक्रिया पृष्ठ पथ: /index.html
    • HTTP रिस्पांस कोड: 200

      1. SEO के लिए + यह सुनिश्चित करने के लिए कि आपका index.html कैश नहीं करता है, निम्न कार्य करें:
    • EC2 उदाहरण कॉन्फ़िगर करें और nginx सर्वर सेटअप करें।

    • अपने EC2 उदाहरण के लिए एक सार्वजनिक आईपी असाइन करें।
    • एक ईएलबी बनाएं जिसमें एक उदाहरण के रूप में आपके द्वारा बनाया गया ईसी 2 उदाहरण है
    • आपको अपने DNS पर ELB असाइन करने में सक्षम होना चाहिए।
    • अब, निम्न कार्य करने के लिए अपने nginx सर्वर को कॉन्फ़िगर करें: अपने CDN के लिए सभी अनुरोधों को Proxy_pass करें (केवल index.html के लिए, अपने क्लाउडफ्रंट से सीधे अन्य संपत्तियों की सेवा करें) और खोज बॉट के लिए, Prenderender.io जैसी सेवाओं द्वारा निर्धारित ट्रैफ़िक को पुनर्निर्देशित करें।

मैं nginx सेटअप के संबंध में अधिक जानकारी में मदद कर सकता हूं, बस एक नोट छोड़ दें। इसे कठिन तरीके से सीखा है।

एक बार क्लाउड फ्रंट डिस्ट्रीब्यूशन अपडेट। प्राचीन मोड में रहने के लिए अपने क्लाउडफ्रंट कैश को अमान्य करें। ब्राउज़र में url मारो और सब अच्छा होना चाहिए।


6
चूँकि S3 403 के साथ प्रतिक्रिया करता है, जब कोई फ़ाइल मौजूद नहीं होती है, तो मुझे लगता है कि ऊपर चरण 4 को Http त्रुटि कोड 403 के लिए भी दोहराया जाना है
Andreas

4
मेरे लिए यह एकमात्र उत्तर है जिसका परिणाम अपेक्षित (स्वीकृत) व्यवहार है
mabe.berlin

1
बिंदु 5 में @ moha297 क्या आप मूल रूप से अपनी साइट को nginx से लाने के लिए कॉन्फ़िगर कर रहे हैं, जो तब CDN (index.html और क्रॉलर अनुरोधों को छोड़कर) से प्रॉक्सी करता है? यदि ऐसा है, तो क्या आप CDN एज सर्वर का लाभ नहीं खो सकते हैं?
राहुल पटेल

2
@ moha297 क्या आप इस टिप्पणी की व्याख्या कर सकते हैं: "आपको सीडीएन से कभी भी index.html की सेवा नहीं देनी चाहिए"? मैं Cloud3 के साथ S3 से index.html की सेवा में समस्या नहीं देखता।
कार्ल जी

1
0 का TTL कैसे प्राप्त होता है, इसके बारे में अधिक जानकारी के लिए stackoverflow.com/a/10622078/4185989 देखें (संक्षिप्त संस्करण: इसे क्लाउडफ्रंट द्वारा कैश किया जाता है, लेकिन एक If-Modified-SinceGET अनुरोध मूल में भेजा जाता है) - जो लोग नहीं चाहते हैं उनके लिए एक उपयोगी विचार हो सकता है। चरण 5 में एक सर्वर सेट करने के लिए जैसे
16

18

यह मूर्त है , लेकिन यहाँ Rackt's React Router लाइब्रेरी का उपयोग करने वालों के लिए एक टिप है (HTML5) ब्राउज़र इतिहास है जो S3 पर होस्ट करना चाहते हैं।

मान लीजिए कि /foo/bearआपके S3 द्वारा होस्ट किए गए स्थिर वेब साइट पर कोई उपयोगकर्ता विज़िट करता है। डेविड के पहले के सुझाव को देखते हुए , पुनर्निर्देशित नियम उन्हें भेजेंगे /#/foo/bear। यदि आपके एप्लिकेशन को ब्राउज़र इतिहास का उपयोग करके बनाया गया है, तो यह बहुत अच्छा नहीं करेगा। हालाँकि आपका आवेदन इस बिंदु पर भरा हुआ है और यह अब इतिहास में हेरफेर कर सकता है।

हमारी परियोजना में Rackt इतिहास को शामिल करना (रीक्रिएट राउटर प्रोजेक्ट से कस्टम हिस्टरी का उपयोग करना भी देखें ), आप एक श्रोता जोड़ सकते हैं जो हैश इतिहास पथ से अवगत हो और इस उदाहरण में सचित्र पथ को प्रतिस्थापित कर सके।

import ReactDOM from 'react-dom';

/* Application-specific details. */
const route = {};

import { Router, useRouterHistory } from 'react-router';
import { createHistory } from 'history';

const history = useRouterHistory(createHistory)();

history.listen(function (location) {
  const path = (/#(\/.*)$/.exec(location.hash) || [])[1];
  if (path) history.replace(path);
});

ReactDOM.render(
  <Router history={history} routes={route}/>,
  document.body.appendChild(document.createElement('div'))
);

संक्षेप में दुहराना:

  1. डेविड की S3 रीडायरेक्ट नियम निर्देशित करेंगे /foo/bearकरने के लिए/#/foo/bear
  2. आपका आवेदन लोड हो जाएगा।
  3. इतिहास श्रोता #/foo/bearइतिहास संकेतन का पता लगाएगा ।
  4. और इतिहास को सही रास्ते से प्रतिस्थापित करते हैं।

Linkटैग अपेक्षा के अनुरूप काम करेंगे, जैसा कि अन्य सभी ब्राउज़र इतिहास फ़ंक्शन करेंगे। एकमात्र नकारात्मक पहलू जो मैंने देखा है, वह अंतरालीय पुनर्निर्देशन है जो प्रारंभिक अनुरोध पर होता है।

यह AngularJS के लिए एक समाधान से प्रेरित था , और मुझे संदेह है कि इसे आसानी से किसी भी एप्लिकेशन के लिए अनुकूलित किया जा सकता है।


2
इससे मुझे माइकल की मदद मिली, धन्यवाद! आप इतिहास से अपना संदर्भ बदलना चाहते हैं और बस BrowserHistory का उपयोग कर सकते हैं। अर्थातbrowserHistory.listen
मार्शल मुटनोट

आपका स्वागत है! मदद करने में खुशी। इसके अलावा, सहमत हूं और इस विशेष उपयोग के मामले के लिए मैंने रिएक्ट राउटर से एक डेप्रिसिएशन चेतावनी को हल करने के लिए स्निपेट को अपडेट किया है।
माइकल अहलर्स

प्रतिक्रिया-राउटर v3.0.0 के रिलीज के साथ, यह काम नहीं करता है, क्योंकि प्रतिक्रिया-राउटर v3.0.0 इतिहास v3.0.0 का उपयोग करता है
वरंड पेज़ेश्कियन

किसी भी विचार कैसे history.listen अनंत कॉल लूप को रोकने के लिए? मुझे लगता है कि रास्ते की जगह लेने के कारण।
मिर्को फ्लाईकमैन

14

मैं इस समस्या के 4 समाधान देखता हूं। पहले 3 जवाबों में पहले से ही शामिल थे और आखिरी मेरा योगदान है।

  1. Index.html में त्रुटि दस्तावेज़ सेट करें।
    संकट : रिस्पांस बॉडी सही होगी, लेकिन स्टेटस कोड 404 होगा, जो SEO को नुकसान पहुंचाता है।

  2. पुनर्निर्देशन नियम निर्धारित करें।
    समस्या : URL प्रदूषित#! लोड होने पर पृष्ठ और पृष्ठ के ।

  3. CloudFront कॉन्फ़िगर करें।
    संकट : सभी पृष्ठ मूल से 404 वापस आ जाएंगे, इसलिए आपको यह चुनने की आवश्यकता है कि क्या आप कुछ भी कैश नहीं करेंगे (टीटीएल 0 जैसा कि सुझाव दिया गया है) या यदि आप साइट को अपडेट करते समय कैश करेंगे और मुद्दे होंगे।

  4. सभी पृष्ठों को प्रस्तुत करें।
    संकट : पृष्ठों को बार-बार बदलने पर विशेष रूप से पृष्ठों के लिए अतिरिक्त काम करना। उदाहरण के लिए, एक समाचार वेबसाइट।

मेरा सुझाव विकल्प 4 का उपयोग करना है। यदि आप सभी पृष्ठों को पहले से रेंडर करते हैं, तो अपेक्षित पृष्ठों के लिए कोई 404 त्रुटियां नहीं होंगी। पृष्ठ ठीक लोड होगा और रूपरेखा नियंत्रण करेगी और एसपीए के रूप में सामान्य रूप से कार्य करेगी। आप त्रुटि दस्तावेज़ को एक सामान्य त्रुटि। Html पृष्ठ और 404 त्रुटियों को पुनर्निर्देशित करने के लिए एक पुनर्निर्देशन नियम 404.html पृष्ठ (हैशबैंग के बिना) को प्रदर्शित करने के लिए भी सेट कर सकते हैं।

403 निषिद्ध त्रुटियों के बारे में, मैं उन्हें बिल्कुल नहीं होने देता। अपने आवेदन में, मैं समझता हूं कि होस्ट बकेट के भीतर सभी फाइलें सार्वजनिक हैं और मैंने इसे पढ़ने की अनुमति के साथ सभी विकल्प के साथ सेट किया है । यदि आपकी साइट में ऐसे पृष्ठ हैं जो निजी हैं, तो उपयोगकर्ता को HTML लेआउट देखने की अनुमति नहीं देनी चाहिए। क्या आप की रक्षा की जरूरत है डेटा है और यह बैकएंड में किया गया है।

इसके अलावा, यदि आपके पास निजी संपत्ति है, तो उपयोगकर्ता फ़ोटो की तरह, आप उन्हें एक और बाल्टी में सहेज सकते हैं । क्योंकि निजी संपत्तियों को डेटा की समान देखभाल की आवश्यकता होती है और उन्हें उन परिसंपत्ति फ़ाइलों की तुलना में नहीं किया जा सकता है जिनका उपयोग ऐप को होस्ट करने के लिए किया जाता है।


1
और आपकी साइट में सभी पृष्ठों के लिए प्रीरेंडर के साथ उपयोग का एक शानदार उदाहरण है। zanon.io/posts/…। धन्यवाद
Frekele

क्या यह चौथा दृष्टिकोण उपयोगकर्ता को पुशस्टेट URL को पुनः लोड करने को संबोधित करता है? यह नेविगेशन को ठीक तरह से संभालता है, लेकिन फिर से लोड करने पर भी यह सर्वर तक पहुंच जाएगा।
अल्फा

@ एलफा, मुझे यकीन नहीं है कि अगर मैं आपके सवाल को सही ढंग से समझ गया हूं, लेकिन फिर से लोड करने पर यह एक नए अनुरोध के रूप में काम करेगा। S3 अनुरोध प्राप्त करेगा और पहले से जारी पृष्ठ को फिर से लौटाएगा। इस मामले में कोई सर्वर नहीं है।
ज़नन

@Zanon आह, मुझे लगता है कि मैं समझता हूं। मैंने सोचा था कि यह पहले से रेंडर पृष्ठों को कैश करने और S3 के अनजाने संसाधनों के लिए जाने से बचें। यह उन मार्गों को छोड़ देगा जिनके पास गतिशील तत्व हैं, ठीक?
अल्फा

1
@Zanon मैं अंत में समझ गया - धन्यवाद! हां, मेरा यही मतलब है। :)
अल्फा

13

मैं आज उसी समस्या में भाग गया लेकिन @ angularjs एप्लिकेशन से हैशबैंग को हटाने के लिए @ मार्क-न्यूटर का समाधान अधूरा था।

वास्तव में आपको एडिट अनुमतियाँ पर जाना होगा , Add More अनुमतियों पर क्लिक करें और फिर अपनी बाल्टी पर सही सूची को सभी के साथ जोड़ें। इस कॉन्फ़िगरेशन के साथ, AWS S3 अब, 404 त्रुटि वापस करने में सक्षम होगा और फिर पुनर्निर्देशन नियम ठीक से मामले को पकड़ लेगा।

सिर्फ इस तरह : यहां छवि विवरण दर्ज करें

और फिर आप संपादित पुनर्निर्देशन नियम पर जा सकते हैं और इस नियम को जोड़ सकते हैं :

<RoutingRules>
    <RoutingRule>
        <Condition>
            <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <HostName>subdomain.domain.fr</HostName>
            <ReplaceKeyPrefixWith>#!/</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

यहाँ आप की जगह ले सकता होस्टनाम अपने डोमेन के साथ subdomain.domain.fr और KeyPrefix #! / आप एसईओ प्रयोजन के लिए hashbang विधि का उपयोग नहीं करते हैं।

बेशक, यह सब केवल तभी काम करेगा जब आपके पास पहले से ही अपने कोणीय अनुप्रयोग में html5mode सेटअप हो।

$locationProvider.html5Mode(true).hashPrefix('!');

इसके साथ मेरा एकमात्र मुद्दा यह है कि आपके पास हैशबैंग का फ्लैश है, जो आपके पास नगनेक्स नियम जैसा कुछ नहीं है। उपयोगकर्ता एक पृष्ठ पर है और ताज़ा करता है: / उत्पादों / 1 -> #! / उत्पादों / 1 -> / उत्पादों / 1
Intellix

1
मुझे लगता है कि आपको सभी को अनुदान सूची की अनुमति के बजाय 403 त्रुटि के लिए एक नियम जोड़ना चाहिए।
हमीश मोफट

11

Amazon S3 और डायरेक्ट URL से काम करने वाले Angular 2+ एप्लिकेशन को बनाने का सबसे आसान उपाय है कि index.html और S3 बकेट कॉन्फ़िगरेशन में इंडेक्स और एरर डॉक्यूमेंट दोनों को निर्दिष्ट किया जाए।

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


11
इस भारी जवाब वाले जवाब का भी यही जवाब है । यह ठीक काम करता है, लेकिन केवल bodyप्रतिक्रिया के लिए। स्टेटस कोड 404 होगा और यह एसईओ को नुकसान पहुंचाएगा।
ज़ानोन

क्योंकि यह केवल आपके लिए काम करता है bodyयदि आपके पास कोई स्क्रिप्ट है जिसे आप आयात करते हैं तो headवे काम नहीं करेंगे जब आप सीधे अपनी वेबसाइट पर किसी भी उप-मार्गों को हिट करते हैं
मोहम्मद हज

4

के बाद से समस्या अभी भी है मैं हालांकि मैं एक और समाधान में फेंक देते हैं। मेरा मामला यह था कि मैं [mydomain] / pull-request / [pr संख्या] /
(ex। Www.example.com/pull-requests/822/) पर उन्हें मर्ज करने से पहले परीक्षण के लिए s3 के लिए सभी पुल अनुरोधों को ऑटो करना चाहता था । )

मेरे ज्ञान के गैर के लिए सबसे अच्छा s3 नियमों के परिदृश्यों में HTML5 रूटिंग का उपयोग करते हुए एक बाल्टी में कई परियोजनाएं होने की अनुमति होगी, जबकि सबसे ऊपर सुझाव दिया रूट फ़ोल्डर में एक परियोजना के लिए काम करता है, यह अपने सबफ़ोल्डर में कई परियोजनाओं के लिए नहीं है।

इसलिए मैंने अपने डोमेन को अपने सर्वर की ओर इशारा किया, जहाँ nginx config ने काम किया था

location /pull-requests/ {
    try_files $uri @get_files;
}
location @get_files {
    rewrite ^\/pull-requests\/(.*) /$1 break;
    proxy_pass http://<your-amazon-bucket-url>;
    proxy_intercept_errors on;
    recursive_error_pages on;
    error_page 404 = @get_routes;
}

location @get_routes {
    rewrite ^\/(\w+)\/(.+) /$1/ break;
    proxy_pass http://<your-amazon-bucket-url>;
    proxy_intercept_errors on;
    recursive_error_pages on;
    error_page 404 = @not_found;
}

location @not_found {
    return 404;
}

यह फ़ाइल प्राप्त करने की कोशिश करता है और यदि नहीं पाया जाता है तो यह html5 मार्ग है और यह कोशिश करता है। यदि आपके पास 404 कोणीय पृष्ठ है, तो आपको न मिले मार्गों के लिए कभी भी @not_found नहीं मिलेगा और आपको कोणीय 404 पृष्ठ मिलेगा, जो नहीं मिली फाइलों के बजाय लौटा है, जिसे @get_routes या कुछ में नियम के साथ निर्धारित किया जा सकता है।

मुझे यह कहना है कि मैं नंगेक्स कॉन्फिग के क्षेत्र में बहुत सहज महसूस नहीं करता हूं और उस बात के लिए रेगेक्स का उपयोग कर रहा हूं, मुझे कुछ परीक्षण और त्रुटि के साथ यह काम मिला है, जबकि यह काम करता है मुझे यकीन है कि इसमें सुधार की गुंजाइश है और कृपया अपने विचार साझा करें ।

नोट : यदि आपने उन्हें S3 कॉन्फिगरेशन में लिया था, तो s3 पुनर्निर्देशन नियम हटा दें

और btw सफारी में काम करता है


नमस्ते .. समाधान के लिए धन्यवाद ... आप s3 परिनियोजन के लिए इस nginx conf फ़ाइल को कहाँ रखते हैं। क्या यह लोचदार बीनस्टॉक के समान है जहां मुझे .exextensions फ़ोल्डर बनाने और उसे प्रॉक्सी.कॉन्फ़िग फ़ाइल में डालने की आवश्यकता है?
user3124360

@ user3124360 लोचदार बीनस्टैक के बारे में निश्चित नहीं है, लेकिन मेरे मामले में मैं अपने डोमेन नाम को ec2 उदाहरण के लिए इंगित करता हूं और वहां nginx config है। इसलिए अनुरोध CLIENT -> DNS -> EC2 -> S3 -> CLIENT जाता है।
एंड्रयू अर्नाटोव

हाँ, मैं कुछ ऐसा ही कर रहा हूँ ... nginx config के साथ यहाँ github.com/davezuko/react-redux-starter-kit/issues/1099 ... आपकी गोपनीय फ़ाइल पोस्ट करने के लिए धन्यवाद .. मैं देखता हूँ कि यह EC2 कैसे विकसित होता है -> S3 कनेक्शन अब
user3124360

3

उसी तरह की समस्या की तलाश में था। मैंने ऊपर वर्णित सुझाए गए समाधानों के मिश्रण का उपयोग करके समाप्त किया।

सबसे पहले, मेरे पास कई फ़ोल्डर के साथ एक s3 बाल्टी है, प्रत्येक फ़ोल्डर एक प्रतिक्रिया / redux वेबसाइट का प्रतिनिधित्व करता है। मैं कैश अमान्यता के लिए क्लाउडफ्रंट का भी उपयोग करता हूं।

इसलिए मुझे 404 का समर्थन करने के लिए रूटिंग नियमों का उपयोग करना पड़ा और उन्हें हैश कॉन्फिगरेशन पर पुनर्निर्देशित करना पड़ा:

<RoutingRules>
    <RoutingRule>
        <Condition>
            <KeyPrefixEquals>website1/</KeyPrefixEquals>
            <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <Protocol>https</Protocol>
            <HostName>my.host.com</HostName>
            <ReplaceKeyPrefixWith>website1#</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
    <RoutingRule>
        <Condition>
            <KeyPrefixEquals>website2/</KeyPrefixEquals>
            <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <Protocol>https</Protocol>
            <HostName>my.host.com</HostName>
            <ReplaceKeyPrefixWith>website2#</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
    <RoutingRule>
        <Condition>
            <KeyPrefixEquals>website3/</KeyPrefixEquals>
            <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <Protocol>https</Protocol>
            <HostName>my.host.com</HostName>
            <ReplaceKeyPrefixWith>website3#</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

मेरे js कोड में, मुझे baseNameप्रतिक्रिया-राउटर के लिए एक कॉन्फिग के साथ इसे संभालने की आवश्यकता थी । सबसे पहले, सुनिश्चित करें कि आपकी निर्भरता इंटरऑपरेबल है, मैंने स्थापित किया था, history==4.0.0जिसके साथ असंगत था react-router==3.0.1

मेरी निर्भरता हैं:

  • "इतिहास": "3.2.0",
  • "प्रतिक्रिया": "15.4.1",
  • "प्रतिक्रिया-रिडक्स": "4.4.6",
  • "प्रतिक्रिया-राउटर": "3.0.1",
  • "प्रतिक्रिया-राउटर-रेडक्स": "4.0.7",

मैंने history.jsइतिहास लोड करने के लिए एक फ़ाइल बनाई है :

import {useRouterHistory} from 'react-router';
import createBrowserHistory from 'history/lib/createBrowserHistory';

export const browserHistory = useRouterHistory(createBrowserHistory)({
    basename: '/website1/',
});

browserHistory.listen((location) => {
    const path = (/#(.*)$/.exec(location.hash) || [])[1];
    if (path) {
        browserHistory.replace(path);
    }
});

export default browserHistory;

कोड का यह टुकड़ा एक हैश के साथ गंभीर द्वारा भेजे गए 404 को संभालने की अनुमति देता है, और हमारे मार्गों को लोड करने के लिए उन्हें इतिहास में बदल देता है।

अब आप इस फाइल का उपयोग अपने स्टोर को अपने रूट फाइल को कॉन्फ़िगर करने के लिए कर सकते हैं।

import {routerMiddleware} from 'react-router-redux';
import {applyMiddleware, compose} from 'redux';

import rootSaga from '../sagas';
import rootReducer from '../reducers';

import {createInjectSagasStore, sagaMiddleware} from './redux-sagas-injector';

import {browserHistory} from '../history';

export default function configureStore(initialState) {
    const enhancers = [
        applyMiddleware(
            sagaMiddleware,
            routerMiddleware(browserHistory),
        )];

    return createInjectSagasStore(rootReducer, rootSaga, initialState, compose(...enhancers));
}
import React, {PropTypes} from 'react';
import {Provider} from 'react-redux';
import {Router} from 'react-router';
import {syncHistoryWithStore} from 'react-router-redux';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import variables from '!!sass-variable-loader!../../../css/variables/variables.prod.scss';
import routesFactory from '../routes';
import {browserHistory} from '../history';

const muiTheme = getMuiTheme({
    palette: {
        primary1Color: variables.baseColor,
    },
});

const Root = ({store}) => {
    const history = syncHistoryWithStore(browserHistory, store);
    const routes = routesFactory(store);

    return (
        <Provider {...{store}}>
            <MuiThemeProvider muiTheme={muiTheme}>
                <Router {...{history, routes}} />
            </MuiThemeProvider>
        </Provider>
    );
};

Root.propTypes = {
    store: PropTypes.shape({}).isRequired,
};

export default Root;

आशा करता हूँ की ये काम करेगा। आप इस विन्यास के साथ मुझे पता चलता है कि मैं redux इंजेक्टर और एक homebrew sagas इंजेक्टर का उपयोग रूटीन के माध्यम से जावास्क्रिप्ट लोडिंग के लिए करता हूँ। Theses लाइनों के साथ बुरा मत मानना।


3

रास्तों को फिर से लिखने के लिए अब आप लैम्ब्डा @ एज के साथ ऐसा कर सकते हैं

यहाँ एक काम lambda @ एज समारोह है:

  1. एक नया लैम्ब्डा फ़ंक्शन बनाएँ, लेकिन रिक्त फ़ंक्शन के बजाय पहले से मौजूद ब्लूप्रिंट में से एक का उपयोग करें।
  2. "क्लाउडफ्रंट" के लिए खोजें और खोज परिणामों से क्लाउडफ्रंट-प्रतिक्रिया-पीढ़ी का चयन करें।
  3. फ़ंक्शन बनाने के बाद, सामग्री को नीचे से बदलें। मुझे नोड रनटाइम को भी 10.x में बदलना पड़ा क्योंकि लेखन के समय क्लाउडफ्रंट नोड 12 का समर्थन नहीं करता था।
'use strict';
exports.handler = (event, context, callback) => {

    // Extract the request from the CloudFront event that is sent to Lambda@Edge 
    var request = event.Records[0].cf.request;

    // Extract the URI from the request
    var olduri = request.uri;

    // Match any '/' that occurs at the end of a URI. Replace it with a default index
    var newuri = olduri.replace(/\/$/, '\/index.html');

    // Log the URI as received by CloudFront and the new URI to be used to fetch from origin
    console.log("Old URI: " + olduri);
    console.log("New URI: " + newuri);

    // Replace the received URI with the URI that includes the index page
    request.uri = newuri;

    return callback(null, request);
};

अपने क्लाउडफ्रंट व्यवहारों में, आप उन्हें "व्यूअर रिक्वेस्ट" पर उस लैम्बडा फ़ंक्शन में कॉल जोड़ने के लिए संपादित करेंगे। यहां छवि विवरण दर्ज करें

पूर्ण ट्यूटोरियल: https://aws.amazon.com/blogs/compute/implementing-default-directory-indexes-in-amazon-s3-backed-amazon-cloudfront-origins-use-lambenedge/


1
आपका कोड उदाहरण केवल एक पंक्ति याद करता है:return callback(null, request);
फेरेमसन

2

यदि आप यहां उस समाधान की तलाश में उतरे हैं, जो रिएक्ट राउटर और एडब्ल्यूएस एम्प्लीफाइड कंसोल के साथ काम करता है - तो आप पहले से ही जानते हैं कि आप क्लाउडफ्रंट रीडायरेक्शन नियमों का सीधे उपयोग नहीं कर सकते हैं क्योंकि एम्पलीफायर कंसोल ऐप के लिए क्लाउडफ्रंट वितरण को उजागर नहीं करता है।

समाधान, हालांकि, बहुत सरल है - आपको इस तरह से प्रवर्धित कंसोल में एक पुनर्निर्देशित / पुनर्लेखन नियम जोड़ना होगा:

रिएक्ट राउटर के लिए कंसोल रीक्रिएट नियम लागू करें

अधिक जानकारी के लिए निम्नलिखित लिंक देखें (और स्क्रीनशॉट से कॉपी-फ्रेंडली नियम):


0

मैं खुद इस बात का जवाब ढूंढ रहा था। S3 केवल पुनर्निर्देशन का समर्थन करने के लिए प्रकट होता है, आप केवल URL को फिर से नहीं लिख सकते हैं और चुपचाप एक अलग संसाधन लौटा सकते हैं। मैं सभी आवश्यक पथ स्थानों में अपने index.html की प्रतियां बनाने के लिए अपनी बिल्ड स्क्रिप्ट का उपयोग करने पर विचार कर रहा हूं। हो सकता है कि वह आपके लिए भी काम करेगा।


2
प्रत्येक पथ के लिए अनुक्रमणिका फ़ाइलों को उत्पन्न करना मेरे दिमाग को भी पार कर गया था, लेकिन उदाहरण के लिए डायनामिक पथों जैसे कि मुश्किल होगा । यदि आप इस प्रश्न का मेरा उत्तर देखते हैं, तो मेरा मानना ​​है कि अधिकांश भाग के लिए समस्या को हल करता है। यह थोड़ा हैक है लेकिन कम से कम यह काम करता है।
मार्क न्यूटर

सभी आने वाले url के लिए nginx सर्वर के पीछे तैनात करने और index.html वापस करने के लिए बेहतर है। मैंने एम्बर ऐप्स के हेरोकू परिनियोजन के साथ इसे सफलतापूर्वक किया है।
moha297

-3

बस अत्यंत सरल उत्तर देने के लिए। यदि आप S3 पर होस्ट कर रहे हैं, तो राउटर के लिए हैश स्थान रणनीति का उपयोग करें।

निर्यात const AppRoutModule: ModuleWithProviders = RouterModule.forRoot (मार्ग, {useHash: true, scrollPositionRestoration: 'सक्षम'});

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