React-router url-lar yangilash yoki qo'lda yozishda ishlamaydi

Men React-routerdan foydalanmoqdaman va u havola tugmachalarini bosganimda yaxshi ishlaydi, lekin veb-sahifamni yangilaganimda u men xohlagan narsani yuklamaydi.

Masalan, men localhost/joblist daman va hammasi yaxshi, chunki men bu yerga havolani bosib keldim. Ammo veb-sahifani yangilasam, men quyidagilarni olaman:

Cannot GET /joblist

Odatiy bo'lib, u bunday ishlamadi. Dastlab mening URL manzilim localhost/#/ va localhost/#/joblist edi va ular juda yaxshi ishladilar. Lekin menga bunday URL yoqmaydi, shuning uchun # ni oʻchirishga urinib, shunday yozdim:

Router.run(routes, Router.HistoryLocation, function (Handler) {
 React.render(<Handler/>, document.body);
});

Bu muammo localhost/ bilan sodir bo'lmaydi, bu har doim men xohlagan narsani qaytaradi.

TUZISH: Bu ilova bir sahifali, shuning uchun /joblist hech qanday serverga hech narsa soʻrashi shart emas.

EDIT2: Mening butun routerim.

var routes = (
    <Route name="app" path="/" handler={App}>
        <Route name="joblist" path="/joblist" handler={JobList}/>
        <DefaultRoute handler={Dashboard}/>
        <NotFoundRoute handler={NotFound}/>
    </Route>
);

Router.run(routes, Router.HistoryLocation, function (Handler) {
  React.render(<Handler/>, document.body);
});

person DavidDev    schedule 13.01.2015    source manba
comment
Agar siz asosiy sayohat sahifangizni yuklash uchun htaccess dan foydalanmasangiz va routeringizga location.pathname dan foydalanishni aytmasangiz, u ishlamaydi.   -  person CJT3    schedule 20.01.2015
comment
Bu # belgisini qanday oʻchirib tashladingiz? Rahmat!   -  person SudoPlz    schedule 06.06.2015
comment
Agar siz reaksiya ilovangizni S3 paqirida joylashtirsangiz, xato hujjatini shunchaki index.html ga o'rnatishingiz mumkin. Bu index.html nima bo'lishidan qat'iy nazar urilishini ta'minlaydi.   -  person Trevor Hutto    schedule 30.07.2016
comment
Mening holimda u Windowsda yaxshi ishlaydi, lekin Linuxda emas   -  person Ejaz Karim    schedule 04.12.2017
comment
Bu mening muammomni hal qilishda yordam bergan ma'lumotnoma: github.com/facebook/create-react-app/blob/master/packages/   -  person jimbotron    schedule 10.07.2018


Javoblar (52)


Qabul qilingan javobga berilgan izohlarga va bu savolning umumiy xususiyatiga ('ishlamaydi') qarab, men bu yerdagi masalalar bo'yicha umumiy tushuntirishlar uchun yaxshi joy bo'lishi mumkin deb o'yladim. Shunday qilib, bu javob OPning maxsus foydalanish holati bo'yicha ma'lumot/ishlab chiqish sifatida mo'ljallangan. Iltimos, sabr qiling.

Server tomoni va mijoz tomoni

Buni tushunish kerak bo'lgan birinchi muhim narsa shundaki, hozirda URL talqin qilinadigan ikkita joy mavjud bo'lsa, "eski kunlarda" faqat 1 ta joy mavjud edi. Ilgari, hayot oddiy bo'lganida, ba'zi foydalanuvchi serverga http://example.com/about so'rovini yubordi, u URLning yo'l qismini tekshirdi, foydalanuvchi haqida sahifani so'raganini aniqladi va keyin o'sha sahifani qaytarib yubordi.

React-Router tomonidan taqdim etilgan mijoz tomonidan marshrutlash bilan ishlar unchalik oson emas. Avvaliga mijozda hali JS kodi yuklanmagan. Shunday qilib, birinchi so'rov har doim serverga bo'ladi. Keyin React va React Router va hokazolarni yuklash uchun kerakli skript teglarini o'z ichiga olgan sahifani qaytaradi. Faqat shu skriptlar yuklangandan keyingina 2-bosqich boshlanadi. 2-bosqichda foydalanuvchi “Biz haqimizda” navigatsiya havolasini bosganida, masalan, URL faqat mahalliy ga http://example.com/about ga oʻzgartiriladi (Tarix API), lekin serverga hech qanday so'rov yuborilmadi. Buning o'rniga, React Router mijoz tomonida o'z ishini qiladi, qaysi React ko'rinishini ko'rsatishni aniqlaydi va uni taqdim etadi. Haqida sahifangiz REST qo'ng'iroqlarini amalga oshirishga hojat yo'q deb hisoblasangiz, u allaqachon bajarilgan. Siz “Uy”dan “Biz haqimizda”ga hech qanday server soʻrovisiz oʻtdingiz.

Demak, havolani bosganingizda, sahifa yangilanishiga olib kelmasdan manzil satridagi URL manzilini boshqaradigan ba'zi Javascript ishlaydi, bu esa o'z navbatida React Router-ni mijozda sahifaga o'tishni amalga oshirishiga olib keladi. -tomoni.

Ammo endi manzil satriga URL-manzilni nusxa ko'chiring va uni do'stingizga elektron pochta orqali yuborsangiz nima bo'lishini ko'rib chiqing. Do'stingiz hali veb-saytingizni yuklamagan. Boshqacha qilib aytganda, u hali ham 1-bosqichda. Uning mashinasida hali hech qanday React Router ishlamaydi. Shunday qilib, uning brauzeri http://example.com/about ga server so'rovi yuboradi.

Va bu erda sizning muammolaringiz boshlanadi. Hozirgacha serveringizning veb-rootiga statik HTMLni joylashtirish bilan qutulishingiz mumkin edi. Lekin bu serverdan so'ralganda boshqa barcha URL manzillar uchun 404 xatolik beradi. Xuddi shu URL manzillar mijoz tomonida yaxshi ishlaydi, chunki u yerda React Router siz uchun marshrutlashni amalga oshiradi, lekin serveringizga tushunarli qilmasangiz, ular server tomonida ishlamay qoladi. ular.

Server va mijoz tomonidan marshrutlashni birlashtirish

Agar siz http://example.com/about URL manzili server va mijoz tomonida ishlashini istasangiz, uning uchun server va mijoz tomonida marshrutlarni o'rnatishingiz kerak. Mantiqiy, to'g'rimi?

Va bu erda sizning tanlovingiz boshlanadi. Yechimlar muammoni butunlay chetlab o'tishdan tortib, HTML yuklash faylini qaytaradigan barcha yo'l orqali server va mijoz bir xil JS kodini boshqaradigan to'liq izomorf yondashuvgacha bo'lgan masofani o'z ichiga oladi.

.

Muammoni butunlay chetlab o'tish: Xesh tarixi

Xesh tarixi bilan oʻrniga Brauzer tarixini o'rgansangiz, "haqida" sahifasi uchun URL manzilingiz quyidagicha ko'rinadi: http://example.com/#/about Xesh (#) belgisidan keyingi qism serverga yuborilmaydi. Shunday qilib, server faqat http://example.com/ ni ko'radi va indeks sahifasini kutilganidek yuboradi. React-Router #/about qismini oladi va to'g'ri sahifani ko'rsatadi.

Kasalliklar:

  • "xunuk" URL manzillar
  • Ushbu yondashuv bilan server tomonida ko'rsatish mumkin emas. Qidiruv tizimini optimallashtirishga (SEO) kelsak, sizning veb-saytingiz deyarli hech qanday tarkibga ega bo'lmagan bitta sahifadan iborat.

.

Hammasini ushlash

Ushbu yondashuv bilan siz Brauzer tarixidan foydalanasiz, lekin shunchaki serverda /* ni index.html ga yuboradigan hamma narsani o'rnatasiz, bu sizga hash tarixi bilan bir xil vaziyatni samarali ta'minlaydi. Biroq, sizda toza URL manzillar bor va siz foydalanuvchining barcha sevimlilarini bekor qilmasdan keyinroq ushbu sxemani yaxshilashingiz mumkin.

Kasalliklar:

  • O'rnatish yanada murakkab
  • Hali ham yaxshi SEO yo'q

.

Gibrid

Gibrid yondashuvda siz ma'lum marshrutlar uchun maxsus skriptlarni qo'shish orqali barchani qamrab oladigan stsenariyni kengaytirasiz. Saytingizning eng muhim sahifalarini kontent bilan qaytarish uchun oddiy PHP skriptlarini yaratishingiz mumkin, shuning uchun Googlebot hech bo'lmaganda sahifangizda nima borligini ko'rishi mumkin.

Kasalliklar:

  • O'rnatish yanada murakkabroq
  • Siz maxsus muomala qilgan marshrutlar uchun faqat yaxshi SEO
  • Server va mijozda kontentni ko'rsatish uchun kodni takrorlash

.

Izomorf

Agar biz JS kodini ikkala uchida ham bir xil ishga tushirishimiz uchun server sifatida Node JS-dan foydalansak-chi? Endi bizda barcha marshrutlarimiz bitta reaktsion-router konfiguratsiyasida aniqlangan va biz renderlash kodimizni takrorlashimiz shart emas. Bu, ta'bir joiz bo'lsa, "muqaddas kosa". Server, agar mijozda sahifaga o'tish sodir bo'lgan bo'lsa, xuddi shunday belgilashni yuboradi. Ushbu yechim SEO nuqtai nazaridan maqbuldir.

Kasalliklar:

  • Server JSni ishga tushirish kerak (qodir boʻlishi). Men Java i.c.w bilan tajriba o'tkazdim. Nashorn, lekin bu men uchun ishlamayapti. Amalda, bu asosan Node JS serveridan foydalanish kerakligini anglatadi.
  • Ko'pgina murakkab ekologik muammolar (server tomonida window dan foydalanish va hokazo)
  • Qattiq o'rganish egri chizig'i

.

Qaysi birini ishlatishim kerak?

O'zingizdan qutulishingiz mumkin bo'lgan birini tanlang. Shaxsan men o'ylaymanki, hamma narsani o'rnatish juda oddiy, shuning uchun bu mening minimal bo'ladi. Ushbu sozlash vaqt o'tishi bilan narsalarni yaxshilashga imkon beradi. Agar siz allaqachon server platformasi sifatida Node JS dan foydalanayotgan bo'lsangiz, men albatta izomorf ilova qilishni tekshirib ko'raman. Ha, avvaliga bu qiyin, biroq uni o‘zlashtirganingizdan so‘ng, bu muammoning juda oqlangan yechimidir.

Shunday qilib, men uchun bu hal qiluvchi omil bo'ladi. Agar mening serverim Node JS da ishlayotgan bo'lsa, men izomorf bo'lardim; aks holda, men Catch-all yechimga borardim va vaqt o'tishi bilan va SEO talablari talab qilganda uni kengaytiraman (Gibrid yechim).

Agar siz React bilan izomorf (universal deb ham ataladi) renderlash haqida ko'proq ma'lumotga ega bo'lishni istasangiz, ushbu mavzu bo'yicha bir nechta yaxshi darsliklar mavjud:

Bundan tashqari, boshlash uchun men bir nechta boshlang'ich to'plamlarni ko'rib chiqishni maslahat beraman. Texnologik stek uchun tanlovlaringizga mos keladiganini tanlang (esda tuting, React MVC-dagi faqat V, to'liq ilova yaratish uchun sizga ko'proq narsalar kerak bo'ladi). Facebookning o'zi tomonidan e'lon qilinganini ko'rib chiqishdan boshlang:

Yoki jamiyat tomonidan ko'pchilikdan birini tanlang. Endi ularning barchasini indekslashga harakat qiladigan yaxshi sayt mavjud:

Men bulardan boshladim:

Hozirda men yuqoridagi ikkita boshlang'ich to'plamdan ilhomlangan universal renderlashning uyda ishlab chiqarilgan versiyasidan foydalanmoqdaman, ammo ular endi eskirgan.

Izlanishingizga omad tilaymiz!

person Stijn de Witt    schedule 14.04.2016
comment
Ajoyib post Stijn! Isomorfik reaksiya ilovasi uchun boshlang'ich to'plam bilan borishni tavsiya qilasizmi? Agar shunday bo'lsa, o'zingiz yoqtirgan misolni keltira olasizmi? - person Chris; 29.04.2016
comment
@Kris Kechiktirilgan javob uchun uzr, men safarda edim. Men bir nechta izomorf boshlang'ich to'plamlarni sinab ko'rdim. Men bu haqda ba'zi ma'lumotlarni postga qo'shaman. - person Stijn de Witt; 06.05.2016
comment
@Stijn - Bu men uchun bir nechta narsalarni aniqladi, rahmat. "Hammasini qo'lga olish" texnikasiga aniqlik kirita olasizmi? Bu hozirda men uchun mantiqiy qadam kabi ko'rinadi, lekin buni qanday amalga oshirish haqida batafsil ma'lumotni qaerdan topishni bilmayman ... - person Paulos3000; 30.10.2016
comment
@Paulos3000 Bu qaysi serverdan foydalanayotganingizga bog'liq. Asosan siz /* uchun marshrutni aniqlaysiz va uni HTML sahifangiz bilan javob berishingiz mumkin. Bu yerda qiyin narsa shu marshrut yordamida .js va .css fayllari soʻrovlarini toʻxtatmasligingizga ishonch hosil qilishdir. - person Stijn de Witt; 30.10.2016
comment
@Paulos3000 Ba'zi tegishli savollar uchun bu yerga qarang: Apache/php, Express/js uchun, J2E/Java uchun. - person Stijn de Witt; 30.10.2016
comment
Men ekspress serverdan foydalanardim. Men uning kodini ko'rdim, lekin uni qanday qilib integratsiya qilishni to'liq bilmayman... Masalan, veb-paket bilan buni qanday qila olaman? - person Paulos3000; 30.10.2016
comment
@Paulos3000 Express aslida buni juda oddiy qiladi. Bu effektga oxirgi ishlov beruvchi sifatida biror narsa qo‘shganingizga ishonch hosil qiling: app.use('*', function(req, res, next) {res.send('<DOCTYPE html ....')}); - person Stijn de Witt; 01.11.2016
comment
... lekin, albatta, siz ekspressdan foydalansangiz, izomorfik/universal yechimni tekshirishingiz kerak;) - person Stijn de Witt; 01.11.2016
comment

Boshqa javoblar RETURNING tomonidan qaytarilgan qiymat(lar) dan qanday foydalanish mumkinligini ko'rsatmaydi. Qaytarilgan qiymat boshqa jadvalga kiritilgan misol.

WITH inserted_id AS (
  INSERT INTO tbl1 (col1)
  VALUES ('foo') RETURNING id
)

INSERT INTO tbl2 (other_id) 
VALUES ((select id from inserted_id));
- person Stijn de Witt; 01.11.2016
comment
Sizga katta rahmat – bu menga marshrutlashning Googling va rasmiy React hujjatlarini o‘qishda ko‘rsatmagan jihatlarini aniqlab berdi. Hujjatlariga qo'shish uchun React folksga yuborishingizni maslahat bera olamanmi? - person John McGrath; 17.12.2016
comment
@JohnMcGrath Rahmat va sizga yordam berganidan xursandman. React Router hujjatlari ko'proq mos keladi. Ular ochiq manbadir, shuning uchun siz uni hissa sifatida taklif qilishingiz mumkin... Balki birinchi navbatda ularni ushbu postga ko'rsatib, qiziqishlarini so'rang? - person Stijn de Witt; 20.12.2016
comment
@Stijn de Witt Bu ajoyib tushuntirish va ushbu mavzu bo'yicha yaxshi javob berilgan. Biroq, ilovangiz quyi katalogda (masalan, iis tomonidan) taqdim etilishi mumkin bo'lgan variantlar qanday bo'lishi mumkin. Ya'ni: domain/appName/routeName yoki domain/appName/subfolder/routeName - person Sagiv b.g; 19.03.2017
comment
Salom, men hash yechimini sinab ko'raman, ammo omad yo'q. createMemoryHistory is not a function xato olinmoqda. Qarangmi? stackoverflow.com/questions/45002573/ - person Leon Gaban; 10.07.2017
comment
@LeonGaban Bu javob yozilganidan beri React Router ularning bajarilishini o'zgartirdi. Endi ular turli tarixlar uchun turli Router misollariga ega va ular tarixni fonda sozlashni amalga oshiradilar. Asosiy tamoyillar hali ham bir xil. - person Stijn de Witt; 17.07.2017
comment
@YarinDekel Rahmat! Ha, ehtimol siz yaratish-reaksiya qilish-ilovasi haqida haqsiz, chunki CRA SSR-ni qutidan tashqari qo'llab-quvvatlamaydi :( - person Stijn de Witt; 08.01.2019
comment
@Stijndewitt Men yechimga qoqilib qoldim, chunki siz aytgan barcha narsa SEOning salbiy tomonini bartaraf qilishi mumkin. Biroq, u faqat tomcatni o'z ichiga oladi. Javobingizni kiritish uchun uni yangilashga arziydimi? - person ns533; 07.07.2019
comment
@ns533 SEO salbiy tomonini qanday bartaraf etishini tushuntirib bera olasizmi? AFAICT, bu Apache-da qayta yozish qoidalariga o'xshaydi... Ya'ni, u hali ham deyarli bo'sh sahifani jo'natish bilan yakunlanadi, brauzerlar hech qanday tarkibni topa olmaydi. - person Stijn de Witt; 08.07.2019
comment
@StijndeWitt Agar veb-brauzer sahifani JavaScript yoqilgan holda ko'rsatmasa, menimcha, bunday bo'lmaydi. Men o‘qib chiqdim, ammo Google veb-brauzerlari butun sahifani ko‘radi. Bu maʼlumotni www.mysite.com/blogpost/* ni index.html ga yoʻnaltiruvchi qoida bilan birlashtirib (google-dan koʻra aqlliroq emas), Google veb-brauzeri har bir blogpostni noyob sahifa sifatida koʻrmasligi kerakmi? - person ns533; 21.07.2019
comment
@ns533 Ha, menimcha, Google uni indekslashi mumkin, chunki ular haqiqatan ham JavaScript-ni ishga tushiradi. Biroq, men, masalan, nima ekanligini bilmayman. Bing va Yahoo qiladi... - person Stijn de Witt; 31.07.2019
comment
@StijndeWitt Juda foydali post, .net da joriy qilingan Catch All yondashuvini tushuntiruvchi manba bormi? Visual Studio tomonidan yaratilgan .Net Core React Web ilovasi shablonida aynan shu muammo borligini tushundim. URL bilan backendni urishga urinish birinchi marta ishlaydi. Ikkinchi marta u hech qachon orqa tomonga o'tmaydi. Uni hal qilish yo'lini topa olmayapman. - person Arthur Medeiros; 08.11.2019
comment
@StijndeWitt Haqiqatan ham yaxshi keng qamrovli tushuntirish. O'ylaymanki, hamma narsani qo'lga kiritadigan yechim unchalik katta ish emas va Django kabi orqa tomonlarni sozlash oson - person Mohammed Shareef C; 14.12.2019
comment
@ ns533 Men bu yechim Tomcat bilan cheklangan deb o'ylamayman. Nginx buni osonlikcha hal qila oladi. Qanday bo'lmasin, bu bir xil echimdir, lekin veb-server (yoki teskari proksi-server) tomonidan boshqariladi - person Mohammed Shareef C; 14.12.2019
comment
Ajoyib javob! Men yaqinda maqola e'lon qildim, unda marshrutlash paytida nima sodir bo'layotgani haqida ba'zi vizualizatsiya mavjud. Umid qilamanki, bu yordam beradi valerii-udodov.com/2020 /24/01/ Assalomu alaykum - person Val; 29.01.2020
comment
Ta'kidlab bo'lmaydigan narsa shundaki, agar siz ilovani yuklasangiz va brauzerdagi url manzilini yo'riqnoma qo'llab-quvvatlaydigan URL manziliga qo'lda o'zgartirsangiz, butun ilova yangilanadi. Men brauzer buni ilovaga yo'naltiradi degan taassurot qoldirdim, lekin bu unday emas. Brauzer React haqida hech narsa bilmaydi va shunchaki har doim qilgan ishni qiladi, ya'ni url uchun kontentni backenddan yuklaydi. - person AndroidDev; 10.04.2020
comment
Ha, URLni serverdan yangi sahifa olishiga sabab bo‘lmasdan o‘zgartirish usuli Tarix API. Agar siz mijoz tomonidagi navigatsiyani sinab ko'rmoqchi bo'lsangiz, ishlab chiqaruvchi konsolini ochishingiz va u erda JS qatorini ishga tushirishingiz mumkin. - person Stijn de Witt; 12.04.2020
comment
@StijndeWitt Shunaqa yaxshi yozilgan javobga ovoz berdi. :) Biroq, faqat bitta narsa: Hammasini qo'lga olish yondashuvida, foydalanuvchining barcha sevimlilarini bekor qilmasdan, bu nimani anglatadi.? ???? - person Glenn Mohammad; 12.04.2020
comment
@GlennMohammad Tasavvur qiling-a, siz Xesh tarixi yondashuvidan boshlaysiz va foydalanuvchilar https://example.com/#/about uchun sevimli (xatcho‘p) qiladilar, agar keyinroq server tomoniga o‘tsangiz, ularning xatcho‘plari endi ishlamaydi. Hammasini Catch bilan boshlasangiz va https://example.com/about return index.html ni yaratsangiz, keyinroq server tomonida renderlashni amalga oshirishingiz mumkin va foydalanuvchi xatcho‘plari ishlayveradi. - person Stijn de Witt; 13.04.2020
comment
Men HashRouter bilan kulgili muammoni topdim: urlni birinchi marta kiritganimda, u yaxshi ishlaydi, lekin agar yana bir xil narsani yozsam, u ilovani butunlay qayta yuklaydi. Masalan, locahost:3000/ da bo'lsam, men mavjud bo'lmagan locahost:3000/test ni yozaman, keyin HashRouter sahifani qayta yuklamaydi. Ammo yana o'sha so'rovni yuborishga urinib ko'rsangiz locahost:3000/test ilova qayta yuklanadi... Nega deb hayronman... ???? - person Watchmaker; 20.04.2020
comment
bu savolga javob juda yaxshi tushuntirilgan, lekin mening yechimim import * sifatida ./serviceWorker dan serviceWorker ni qo'shish edi; va App.js da serviceWorker.register() va sahifalarni yomon url havolalarisiz yangilashim mumkin: medium.com/@krishnarai1985/ - person EduardoUstarez; 17.09.2020
comment
@EduardoUstarez Sizning yechimingiz umumiy holatda ishlamaydi. Sinab ko'rish uchun havolani do'stingizga yuboring. Xizmat ko'rsatuvchi xodimlar mijoz tomonidagi narsadir. Ular faqat o'tmishda sahifani yuklagan va xizmat ko'rsatish xodimi o'rnatilgan mijozlarda ishlaydi. Agar URL manzillaringiz barcha holatlarda ishlashini istasangiz, sizga server tomonidagi yechim kerak bo'ladi. - person Stijn de Witt; 28.12.2020
comment
404 va 403 javoblarni /index.html ga yo'naltirish muammoni hal qilmaydimi? - person tymik; 30.12.2020
comment
@tymik Men buni iflos hack deb hisoblayman. Men veb-saytimda mavjud bo'lmagan URL manzillar uchun 404 qiymatini qaytarishini xohlayman. Bunday yechim bilan barcha URL-lar index.html ga yo'naltiriladi, lekin men veb-saytimni qilishni xohlamayman. Biroq, bu siz uchun maqbul bo'lishi mumkin. - person Stijn de Witt; 03.01.2021
comment
Catch-all yondashuvini qanday boshlash kerak? - person Yash Karanke; 04.01.2021
comment
@StijndeWitt, lekin siz marshrutizatoringizda 404 ni ishlatasiz va ilovangiz ichida xohlagan narsani qaytarasiz - bu bitta sahifali ilovalar uchun juda yaxshi yechim bo'lib tuyuladi. Shu tarzda CloudFront bilan juda yaxshi ishlaydi. - person tymik; 04.01.2021
comment
@YashKaranke Sizning serveringiz nima? Ilovangiz foydalanadigan barcha URL manzillar uchun index.html ni qaytarish uchun uni sozlashingiz kerak. Lekin buni faqat HTML uchun qilishiga ishonch hosil qiling, tasvirlar, skriptlar va boshqalar uchun emas. - person Stijn de Witt; 06.01.2021
comment
@StijndeWitt Apache, men umumiy papkaga .htaccess fayl qo'shdim va u hozir juda yaxshi ishlaydi - person Yash Karanke; 06.01.2021
comment
Menda buning yechimi bor, yaqinda loyihada bu muammoga duch keldim, ehtimol vaqtim bo'lganda javob yozaman - person Inzamam Malik; 10.07.2021
comment
HashRouter dan foydalanish shart emas - person Inzamam Malik; 10.07.2021

Bu erda berilgan javoblar juda foydali, men uchun ishlagan narsa mening Webpack serverimni marshrutlarni kutish uchun sozlash edi.

devServer: {
   historyApiFallback: true,
   contentBase: './',
   hot: true
},

HistoryApiFallback men uchun bu muammoni hal qildi. Endi marshrutlash to'g'ri ishlaydi va men sahifani yangilashim yoki to'g'ridan-to'g'ri URL-manzilni kiritishim mumkin. Tugun serveringizdagi ishlash haqida tashvishlanishga hojat yo'q. Bu javob faqat veb-paketdan foydalansangiz ishlaydi.

EDIT: Bu nima uchun zarurligi haqida batafsilroq sababni bilish uchun javobimni bu yerda ko'ring: https://stackoverflow.com/a/37622953/5217568

person jmancherje    schedule 26.05.2016
comment
Esda tutingki, Webpack jamoasi ishlab chiqarishda ishlab chiqaruvchi serverdan foydalanishni tavsiya qilmaydi. - person Stijn de Witt; 13.06.2016
comment
Umumiy rivojlanish maqsadlari uchun bu eng yaxshi yechimdir. historyApiFallback yetarli. Boshqa barcha variantlarga kelsak, uni CLI-dan --history-api-fallback bayrog'i bilan ham sozlash mumkin. - person Marco Lazzeri; 27.10.2016
comment
@Kunok Unday emas. Bu rivojlanish uchun tezkor tuzatish, lekin siz hali ham ishlab chiqarish uchun nimanidir aniqlashingiz kerak bo'ladi. - person Stijn de Witt; 31.05.2017
comment
contentBase :':/' sababi ilova fayllaringizga url orqali kirish mumkin - person Nezih; 21.02.2018
comment
Menda bu muammo serverda ham, mahalliy ham bor edi. Bu mahalliy aholi uchun aniqlangan. .htaccess serverda o'rnatildi. - person Izabela Furdzik; 05.06.2021
comment
React 17 uchun ishlaydi. Rahmat - person prathameshk73; 26.06.2021

.htaccess faylingizni oʻzgartirishingiz va buni kiritishingiz mumkin:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteRule . /index.html [L]
</IfModule>

Men react: "^16.12.0" va react-router: "^5.1.2" dan foydalanaman.

person BrahimS    schedule 14.11.2016
comment
Bu yaxshi ishlaydi! va agar siz ilovangizni qayta qurishni xohlamasangiz, eng osoni - person mhyassin; 13.02.2018
comment
Birinchi qator sifatida RewriteEngine On-ni unutmang - person Kai Qing; 01.11.2018
comment
E'tibor bering, bu javob Apache serveridagi konfiguratsiyaga tegishli. Bu React ilovasining bir qismi emas. - person Colton Hicks; 17.07.2019
comment
Yuqoridagi javoblarni tushunmadim. O'quv qo'llanmalarining hech biri mening havolalarim jonli ravishda ishlamasligini aytmagan. Biroq, bu oddiy htaccess fayli ishladi. rahmat - person Thomas Williams; 26.03.2020
comment
Bu next.js statik eksporti uchun ham ishlaydi. Tomcat tugunga o'xshamaganligi sababli, keyingi.js statik eksporti uchun ushbu qo'shimcha konfiguratsiya kerak. - person giri-jeedigunta; 04.04.2020
comment
Bu juda yaxshi ishlaydi, ehtimol bu tasodif emas. Mening chuqur URL manzillarimning 80% endi yangilanishi mumkin, bu aniq yaxshilanish. - person Chris G; 29.05.2020
comment
Kimdir menga yordam bera oladimi? Bu htaccess qayerga qo'yilgan? Faylni qo'shgandan so'ng npm run build ni bajarishingiz kerakmi? - person Muteshi; 05.09.2020
comment
Men npm run build va keyin buni .htacess-ga qurilish papkasiga qo'shdim va cPanel-ga yukladim, hali ham ishlamayapti - person Tayyab Ferozi; 10.12.2020
comment
@TayyabFerozi Siz RewriteBase dan keyingi va oxirgi RewriteRule dan keyingi yoʻl ilova yashaydigan jildga (agar u pastki jild boʻlsa) mos kelishiga ishonch hosil qilishingiz kerak. - person Jason Ellis; 22.12.2020
comment
Menda bu muammo serverda ham, mahalliy ham bor edi. Bu server uchun tuzatildi. devServer konfiguratsiyasi uni mahalliy sifatida tuzatdi. - person Izabela Furdzik; 05.06.2021

React Router V4 foydalanuvchilari uchun:

Agar siz ushbu muammoni boshqa javoblarda aytib o'tilgan "Xesh History" usuli bilan hal qilishga harakat qilsangiz, e'tibor bering

<Router history={hashHistory} >

V4 da ishlamaydi, o‘rniga HashRouter dan foydalaning:

import { HashRouter } from 'react-router-dom'

<HashRouter>
  <App/>
</HashRouter>

Malumot: HashRouter

person user2875289    schedule 18.04.2017
comment
HashRouter nima uchun bu muammoni hal qilgani haqida batafsil ma'lumot bera olasizmi? Siz bergan havola buni men uchun tushuntirmaydi. Bundan tashqari, yo'lda xashni yashirishning bir usuli bormi? Men BrowserRouter-dan foydalanardim, lekin u bilan bu 404 muammosiga duch keldim. - person Ian Smith; 07.06.2020
comment
men brauzer routeridan foydalanardim va u yangilashda 404 xatoga sabab bo'ldi, lekin keyin men brauzer routerini hash router bilan almashtirdim va u yaxshi ishlamaydi. rahmat - person newbie; 31.07.2020

Men hozirda veb-sayt yaratish uchun create-react-app-dan foydalanganman va bu erda xuddi shu muammoni ko'rsatdim. Men react-router-dom paketidagi BrowserRouting dan foydalanaman. Men Nginx serverida ishlayapman va men uchun buni hal qilgan narsa /etc/nginx/yourconfig.conf ga quyidagilarni qo'shdi.

location / {
  if (!-e $request_filename){
    rewrite ^(.*)$ /index.html break;
  }
}

Bu Appache ishlayotgan bo'lsangiz, .htaccess ga quyidagilarni qo'shishga mos keladi

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]

Bu, shuningdek, Facebook tomonidan taklif qilingan yechim kabi ko'rinadi va uni bu yerda

person Aidin    schedule 04.09.2017
comment
Voy, nginx uchun juda oddiy yechim; yangi nginx foydalanuvchisi sifatida joziba kabi ishlaydi. Faqat nusxa ko'chiring va tayyor. Rasmiy fb hujjatlariga ulanish uchun +1. Borish uchun yo'l. - person user3773048; 13.01.2019
comment
Ma'lumot uchun: Men nginx va Angular ilovasi bilan AWS misolidan foydalanmoqdaman. Bu ishlaydi. - person Diego Sarmiento; 03.06.2019
comment
sen meni qutqar. Men kechagi muammomni tuzatishga harakat qilardim, men bir nechta echimdan charchadim, lekin muvaffaqiyatsiz bo'ldim. Nihoyat, siz menga yo'riqnoma muammosini hal qilishda yordam berdingiz. oh katta rahmat aka - person Sharifur Robin; 22.09.2019
comment
Reakt uchun boshqa narsa kerakmi: ^16.8.6, reaktsion-router: ^5.0.1? Men ushbu echimlarni (ham nginx, ham apache) sinab ko'rdim va ular ishlamayapti. - person Mark A. Tagliaferro; 21.10.2019
comment
Facebook bu boradagi hujjatlarini o'zgartirmaganligi sababli, men faqat protsedura bir xil deb taxmin qilishim mumkin. Men buni anchadan beri sinab ko'rmadim. - person Aidin; 21.10.2019
comment
Bu bilan bir necha hafta shug'ullanish va bu ishlaydigan yagona yechim. rahmat - person abby; 29.05.2020
comment
Salom, agar react papkasi taxallus root bo'lmasa, bu qanday ishlashini ayta olasizmi? - person krishna lodha; 25.05.2021

index.html head ga quyidagilarni qo'shing:

<base href="/uz/">
<!-- This must come before the css and javascripts -->

Keyin webpack dev server bilan ishlaganda ushbu buyruqdan foydalaning.

webpack-dev-server --mode development --hot --inline --content-base=dist --history-api-fallback

--history-api-fallback muhim qismdir

person Efe Ariaroo    schedule 01.04.2018
comment
Bu ajoyib ishladi! Ushbu yechimni qanday topganingiz/topganingiz haqida ko'proq o'qish uchun havolalar bormi? - person justDan; 26.06.2018
comment
Kechirasiz, uka. Uni sinab ko'rilgan va sinovdan o'tgan xato usuli orqali topdim. - person Efe Ariaroo; 30.06.2018
comment
Shuni ta'kidlash kerakki, agar siz / bo'lmagan asosiy href dan foydalansangiz, HashRouter ishlamaydi (agar siz xesh marshrutlashdan foydalansangiz) - person scrowler; 17.01.2019
comment
‹base href=/› tegi buni men uchun qildi. Buning uchun rahmat. Webpack dev serveri toʻplamni yoʻldan/‹bundle› dan tortib olishga urinib koʻrdi va muvaffaqiyatsiz boʻldi. - person Malisbad; 26.03.2019
comment
Men React.js + Webpack rejimidan foydalanmoqdaman. Package.json fayliga --history-api-fallback parametrini qo'shdim. Keyin sahifani yangilash to'g'ri ishlaydi. Har bir kodni o'zgartirganimda, veb-sahifa avtomatik ravishda yangilanadi. ``` skriptlar: { start: rimraf build && cross-env NODE_ENV='ishlab chiqish' veb-to'plami --rejimni ishlab chiqish && cross-env NODE_ENV=ishlab chiqish webpack-dev-server --history-api-fallback, ... } `` ` - person NinjaDev; 13.08.2020

Navigatsiya mijozda yoki serverda sodir bo'lishiga qarab, yo'riqnoma ikki xil usulda chaqirilishi mumkin. Siz uni mijoz tomonida ishlash uchun sozlagansiz. Asosiy parametr ishlash usuli uchun ikkinchisi, joylashuv .

React Router Link komponentidan foydalansangiz, u brauzer navigatsiyasini bloklaydi va mijoz tomonida navigatsiya qilish uchun transitionTo ni chaqiradi. Siz HistoryLocation-dan foydalanmoqdasiz, shuning uchun u manzil satrida yangi URL-manzilni simulyatsiya qilish orqali navigatsiya illyuziyasini yakunlash uchun HTML5 tarixi API-dan foydalanadi. Agar eski brauzerlardan foydalansangiz, bu ishlamaydi. HashLocation komponentidan foydalanishingiz kerak bo'ladi.

Yangilashni bosganingizda, siz barcha React va React Router kodlarini chetlab o'tasiz. Server /joblist so'rovini oladi va u biror narsani qaytarishi kerak. Serverda to'g'ri ko'rinishni ko'rsatishi uchun run usuliga so'ralgan yo'lni o'tkazishingiz kerak. Xuddi shu marshrut xaritasidan foydalanishingiz mumkin, lekin Router.run raqamiga boshqa qo‘ng‘iroq qilish kerak bo‘lishi mumkin. Charlz ta'kidlaganidek, buni hal qilish uchun URLni qayta yozishdan foydalanishingiz mumkin. Yana bir variant - barcha so'rovlarni bajarish uchun node.js serveridan foydalanish va joylashuv argumenti sifatida yo'l qiymatini o'tkazish.

Masalan, ekspressda u quyidagicha ko'rinishi mumkin:

var app = express();

app.get('*', function (req, res) { // This wildcard method handles all requests

    Router.run(routes, req.path, function (Handler, state) {
        var element = React.createElement(Handler);
        var html = React.renderToString(element);
        res.render('main', { content: html });
    });
});

E'tibor bering, so'rov yo'li run ga uzatilmoqda. Buni amalga oshirish uchun sizda ko'rsatilgan HTMLni uzatishingiz mumkin bo'lgan server tomondan ko'rish mexanizmi bo'lishi kerak. renderToString dan foydalanish va serverda Reactni ishga tushirishda bir qator boshqa fikrlar mavjud. Sahifa serverda ko'rsatilgandan so'ng, ilovangiz mijozga yuklanganda, kerak bo'lganda server tomonida ko'rsatilgan HTMLni yangilab, yana ko'rsatiladi.

person Todd    schedule 21.01.2015
comment
Kechirasiz, iltimos, yangilash tugmasini bosganingizda keyingi bayonotni tushuntirib bera olasizmi, siz React va React Router kodlarini chetlab o'tasizmi? Nima uchun bu sodir bo'ladi? - person VB_; 08.09.2015
comment
React router odatda faqat brauzer ichidagi turli "yo'llarni" boshqarish uchun ishlatiladi. Buni amalga oshirishning ikkita odatiy usuli mavjud: eski uslubdagi xesh-yo'l va yangiroq API tarixi. Brauzerni yangilash server so'rovini yuboradi, bu sizning mijoz tomonidagi marshrutizator kodini chetlab o'tadi. Siz serverdagi yo'lni boshqarishingiz kerak bo'ladi (lekin faqat API tarixidan foydalansangiz). Buning uchun reaktsion routerdan foydalanishingiz mumkin, lekin siz yuqorida aytib o'tganimga o'xshash ishni qilishingiz kerak bo'ladi. - person Todd; 09.09.2015
comment
tushundim. Agar server JS bo'lmagan tilda bo'lsa (aytaylik, Java) qanday bo'lishi kerak? - person VB_; 09.09.2015
comment
Bunday holda, vaziyat yanada qiyinlashadi. Izomorf ilovalar va'dasi mijoz va serverda JS dan foydalanish orqali amalga oshiriladi. Agar siz Java doirasida JS-ni ishga tushira olmasangiz, siz haqiqatan ham izomorfizmga ega bo'lmaysiz va reaktiv routerdan foydalana olmaysiz. Bu kabi ishlarni qila oladigan ReactJS.NET kabi ba'zi server tomoni echimlari mavjud. Biroq, Node.js dan foydalanish osonroq. - person Todd; 11.09.2015
comment
bu javobdagi birinchi parametr marshrutlari nima? Chunki ‹Route name=root path=/ handler={App} /› kabi biror narsani kiritganingizda SyntaxError xatosi paydo bo'ladi: kutilmagan token ‹ - person Code Uniquely; 15.10.2015
comment
Kechirasiz... siz root bo'lmagan marshrutni ko'rsatish uchun ekspress-server talab qilyapsizmi? Avvaliga izomorfizmning ta'rifi uning kontseptsiyasiga ma'lumotlarni olishni o'z ichiga olmaganiga hayron bo'ldim (agar siz ma'lumotlar serverida BILAN ko'rinishni taqdim qilmoqchi bo'lsangiz, ishlar juda murakkab, ammo bu aniq SEO talabi bo'lar edi - va izomorfizm buni da'vo qiladi). Endi men WTF reaktsiyasiga o'xshayman, jiddiy... Agar noto'g'ri bo'lsam, meni to'g'rilang, marshrutni ko'rsatish uchun ember/angular/backbone server narsa talab qiladimi? Men, albatta, marshrutlardan foydalanishga bo'lgan talabni tushunmayapman - person Ben; 17.10.2015
comment
@Ben Agar noto'g'ri bo'lsam, meni tuzating, marshrutni ko'rsatish uchun ember/burchak/magistral server narsa talab qiladimi? Ha, aslida ular tarix joylashuvidan ("haqiqiy url") foydalanganda shunday qilishadi. Barcha Javascript ramkalari shunday qiladi. Esda tutingki, URL manzilini so'raganingizda, avval serverga borasiz. Nima sodir bo'layotgani shundaki, OP server tomonida to'g'ri yo'naltirilmayapti. U shunchaki xesh joylashuvidan foydalanishi yoki serverni har doim barcha mumkin bo'lgan yo'nalishlarda HTMLga xizmat ko'rsatish uchun sozlashi kerak. - person Stijn de Witt; 17.11.2015
comment
Bu mening reaksiya ilovam izomorf bo'lmasa, reaktsiya-routerda yangilash ishlamaydi, degani? - person Matt; 07.12.2015
comment
Ishga kirishish uchun siz routerni mijoz kodidan (standart React muhiti) va server kodidan (Node.js) chaqirishingiz kerak. Agar buni qila olsangiz, ilovangiz izomorf bo'ladi. E'tibor bering, ushbu javobdagi kod yangi React Router 1.0 versiyasidagi o'zgarishlarni aks ettirmaydi (hozirgi vaqtda). - person Todd; 08.12.2015
comment
@Matt Agar sizning reaksiya ilovangiz izomorf bo'lmasa (yoki siz server tomonida JS ishlamayotgan bo'lsangiz ham, aytaylik, PHP), sizning eng yaxshi garovingiz hamma uchun bir xil sahifani qaytaradigan server tomonidagi skriptga ega bo'lishdir. mumkin bo'lgan yo'nalishlar. Mijozga faqat ba'zi umumiy bootstrap HTML yuboriladi. Mijozga kirgandan so'ng, React-Router URL manziliga qaraydi va narsalar kutilganidek ishlaydi. Ammo salbiy tomoni SEO bilan bog'liq. Google faqat o'sha bootstrap HTMLni ko'radi va veb-saytingizni indekslamaydi. - person Stijn de Witt; 14.04.2016

Agar siz React ilovasini yaratishdan foydalanayotgan bo'lsangiz:

Ko'pgina yirik hosting platformalari uchun yechimlar bilan bu muammoni hal qilish uchun ajoyib yurish bor, siz ularni topishingiz mumkin SHU YERDA. Masalan, men frontend kodim uchun React Router v4 va Netlify-dan foydalanaman. Buning uchun mening umumiy jildga ("_redirects") 1 ta fayl va ushbu fayldagi bitta kod qatori qo'shildi:

/*  /index.html  200

Endi mening veb-saytim brauzerga kiritilganda yoki kimdir yangilashni bosganida mysite.com/pricing kabi yo'llarni to'g'ri ko'rsatadi.

person Colton Hicks    schedule 09.06.2017
comment
agar siz Apache HTTP serveridan foydalanayotgan bo‘lsangiz, .htaccess ishlamasa, apache versiyasini tekshiring, chunki 2.3.9 va undan keyingi versiyalar birlamchi AllowOverride< /b> Yo'q bo'lsa, AllowOverride ni Hammasi ga o'zgartirishga harakat qiling. ushbu javobni tekshiring - person Muhammad Adam C; 13.04.2021

Agar siz AWS Static S3 Hosting va CloudFront orqali reaksiyaga kirishuvchi ilovani joylashtirayotgan bo'lsangiz

Bu muammo CloudFront tomonidan 403 Access Denied xabari bilan javob berib oʻzini namoyon qildi, chunki u mening S3 jildimda /some/other/path mavjud boʻlishini kutgan edi, lekin bu yoʻl faqat React-ning react-router bilan marshrutlash tizimida mavjud.

Yechim tarqatish xatosi sahifalari qoidasini o'rnatish edi. CloudFront sozlamalariga o'ting va tarqatishni tanlang. Keyin "Xato sahifalari" yorlig'iga o'ting. "Xususiy xato javobini yaratish" tugmasini bosing va 403 uchun yozuvni qo'shing, chunki bu biz olgan xatolik holati kodi. Javob sahifasi yo'lini /index.html va holat kodini 200 ga o'rnating. Yakuniy natija meni soddaligi bilan hayratda qoldiradi. Indeks sahifasi taqdim etiladi, lekin URL brauzerda saqlanadi, shuning uchun reaksiya ilovasi yuklangandan so'ng, u URL yo'lini aniqlaydi va kerakli marshrutga o'tadi.

Xato sahifalari 403 qoidasi

person th3morg    schedule 23.11.2017
comment
Aynan shu narsa menga kerak edi. Rahmat. - person Jonathan; 19.09.2019
comment
Shunday qilib, barcha urllaringiz ishlaydi, lekin 403 holat kodi qaytariladimi? Bu to'g'ri emas. Kutilayotgan holat kodlari 2xx oralig'ida bo'lishi kerak. - person Stijn de Witt; 21.10.2019
comment
@StijndeWitt To'g'ri tushunganingizga amin emasman. CloudFront hamma narsani hal qiladi - mijoz 403 status kodini ko'rmaydi. Qayta marshrutlash server tomonida sodir bo'ladi, indeks sahifasini ko'rsatadi, urlni saqlaydi va natijada to'g'ri marshrutni taqdim etadi. - person th3morg; 22.10.2019
comment
@th3morg Ha, endi ko'raman. Bu sizga javob holati kodini 200 sifatida to‘ldirishga ham imkon berishini o‘tkazib yubordim. Demak, siz asosan 403 holatini 200 holatiga moslashtiryapsiz... Yaxshi ko‘rinadi... bundan tashqari, boshqa sababga ko‘ra natijada 403 ni olgan bo‘lsangiz. bu tufayli siz uni ko'ra olmaysiz. - person Stijn de Witt; 23.10.2019
comment
@StijndeWitt Bu, xususan, CloudFront-dan 403, shuning uchun siz saytingizdan asinxron 403 javobiga olib keladigan API qo'ng'irog'ini qilishni aytsangiz, u odatdagidek harakat qiladi. Men CloudFront-ning o'zidan 403 xatti-harakatini fosh qilmoqchi bo'lgan stsenariyni tasavvur qila olmayman, lekin shunday bo'lishi mumkin. Ushbu yechim 99+% foydalanish holatlarida ishlashi kerak. - person th3morg; 23.10.2019
comment
Buning uchun rahmat @th3morg. Ushbu sozlash ko'p darajali yo'llar uchun ham ishlaydimi? Agar domen/roʻyxatdan oʻtish, domen/login, domen/‹documentId› kabi ildiz darajasida biron bir yoʻl boʻlsa, bu men uchun juda yaxshi ishlaydi, lekin domen/document/‹documentId› kabi koʻp darajali yoʻllar uchun ishlamaydi. - person Pargles; 03.02.2020
comment
Ey go'zal borliq! Uni 404 javobi uchun sozlash kerak edi va u joziba kabi ishladi! - person Nnanyielugo; 06.07.2020

Bu sizning muammoingizni hal qilishi mumkin

Men ishlab chiqarish rejimida ReactJS ilovasida ham xuddi shunday muammoga duch keldim. Mana muammoning 2 yechimi.

1.Marshrutlash tarixini oʻrniga brauzerHistory oʻrniga hashHistory ga oʻzgartiring

<Router history={hashHistory} >
   <Route path="/home" component={Home} />
   <Route path="/aboutus" component={AboutUs} />
</Router>

Endi buyruq yordamida dasturni yarating

sudo npm run build

Keyin o'rnatish jildini var/www/ jildingizga joylashtiring, Endi ilova har bir URL manziliga # teg qo'shilishi bilan yaxshi ishlamoqda. kabi

localhost/#/home localhost/#/aboutus

Yechim 2: browserHistory yordamida # tegsiz,

Routeringizda tarixingizni = {browserHistory} o'rnating, endi uni sudo npm run build yordamida yarating.

404 topilmagan sahifani hal qilish uchun conf faylini yaratishingiz kerak, conf fayli shunday bo'lishi kerak.

terminalingizni oching, quyidagi buyruqlarni kiriting

cd /etc/apache2/sites-available ls nano sample.conf Unga quyidagi tarkibni qo'shing.

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName 0.0.0.0
    ServerAlias 0.0.0.0
    DocumentRoot /var/www/html/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    <Directory "/var/www/html/">
            Options Indexes FollowSymLinks
            AllowOverride all
            Require all granted
    </Directory>
</VirtualHost>

Endi siz quyidagi buyruq yordamida sample.conf faylini yoqishingiz kerak

cd /etc/apache2/sites-available
sudo a2ensite sample.conf

keyin u sizdan sudo xizmati apache2 qayta yuklash yoki qayta ishga tushirishdan foydalanib, apache serverini qayta yuklashingizni so'raydi

keyin localhost/build papkangizni oching va quyidagi mazmunga ega .htaccess faylini qo'shing.

   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-l
   RewriteRule ^.*$ / [L,QSA]

Endi ilova normal ishlamoqda.

Eslatma: 0.0.0.0 IP-ni mahalliy IP-manzilingizga o'zgartiring.

Agar bu borada shubhangiz bo'lsa, sharhlaringizni bildiring.

Umid qilamanki, bu boshqalarga foydalidir.

person Venkatesh Somu    schedule 07.02.2017
comment
Birinchi yechim "react-router-dom": "^5.1.2" uchun ishlaydimi?, men <BrowserRouter> dan foydalanmoqdaman - person 151291; 13.12.2019
comment
.htaccess uni men uchun tuzatdi. - person beltrone; 03.02.2021
comment
2-chi yechimda brauzer tarixini qayerdan olsam bo'ladi. - person Sushil; 06.02.2021
comment
faqat .htaccess faylini qo'shish men uchun o'rnatilgan qurilish papkasida, rahmat odam - person coderLogs; 19.05.2021

Agar siz reaktsiya ilovangizni IIS da joylashtirsangiz, shunchaki quyidagini o'z ichiga olgan web.config faylini qo'shing:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="404" subStatusCode="-1" />
        <error statusCode="404" path="/" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>
</configuration>

Bu IIS serveriga 404 xato o'rniga mijozga asosiy sahifani qaytarishini va xesh tarixidan foydalanishni talab qilmaydi.

person Chtiwi Malek    schedule 18.10.2017

Webpack Dev Serverda buni yoqish imkoniyati mavjud. package.json ni oching va --history-api-fallback qo'shing. Bu yechimlar men uchun ishladi.

react-router- darslik

person sree    schedule 09.09.2016
comment
webpack-dev-server bilan yaxshi, lekin ishlab chiqarishni qurish uchun buni qanday tuzataman? - person Hussain; 15.08.2018

Ishlab chiqarish stack: React, React Router v4, BrowswerRouter, Express, Nginx

1) Chiroyli URL manzillar uchun foydalanuvchi BrowserRouter

// app.js

import { BrowserRouter as Router } from 'react-router-dom'

const App = () {
  render() {
    return (
        <Router>
           // your routes here
        </Router>
    )
  }
}

2) /* yordamida barcha noma'lum so'rovlarga index.html qo'shing

// server.js

app.get('/*', function(req, res) {   
  res.sendFile(path.join(__dirname, 'path/to/your/index.html'), function(err) {
    if (err) {
      res.status(500).send(err)
    }
  })
})

3) veb-paketni webpack -p bilan birlashtiring

4) nodemon server.js yoki node server.js yugurish

EDIT: Siz nginx-ga buni server blokida boshqarishiga ruxsat berishingiz va 2-bosqichga e'tibor bermasligingiz mumkin:

location / {
    try_files $uri /index.html;
}
person Isaac Pak    schedule 09.08.2017
comment
aniqlanmagan yo'lni olish - person Goutham; 10.08.2017
comment
@Goutham server.js faylingizning yuqori qismiga import path from 'path yoki const path = require('path') qo'shing - person Isaac Pak; 10.08.2017
comment
2-qadam (barchasini /* bilan tuting) mening kunimni saqlab qoldi. Rahmat! :) - person Atlas7; 22.11.2017
comment
Bu ishlaydi, redux-dan foydalanadigan va ulangan yo'riqnoma bilan bog'liq odamlar uchun quyidagi misolga qarang: github.com/supasate/connected-react-router/tree/master/examples/ - person cjjenkinson; 16.04.2018

Buni webpack.config.js ga qo'shing:

devServer: {
    historyApiFallback: true
}
person suraj    schedule 11.09.2017
comment
Bu ishlab chiquvchilar uchun juda yaxshi, lekin ishlab chiqarishni qurishda yordam bermaydi. - person KFunk; 05.05.2020

Quyidagi kod bilan umumiy papkaga ".htaccess" faylini qo'shib ko'ring.

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

RewriteRule ^ /index.html [L]  
person Kiran Joshi    schedule 29.06.2018
comment
Rahmat, bu men uchun Fedora 28 da apache bilan ishlagan narsa edi. Yuqoridagi qayta yozish qoidalarining hech biri yoki CRA sahifasidagi qoidalar men uchun ishlamadi. Men ularni alohida .htaccess faylida emas, balki virtual xost sozlamalariga qo'shdim. - person boerre; 25.11.2019

Agar sizda index.html faylingizga zaxirangiz bo'lsa, index.html faylingizda quyidagilar mavjudligiga ishonch hosil qiling:

<script>
  System.config({ baseURL: '/' });
</script>

Bu loyihadan loyihaga farq qilishi mumkin.

person Matt Goo    schedule 03.05.2016
comment
Buni html head-ga qo'shing: ‹base href=/› - person Efe Ariaroo; 02.04.2018

Agar siz firebase’dan foydalanayotgan bo‘lsangiz, ilovangiz ildizida (hosting bo‘limida) firebase.json faylida qayta yozish xususiyati borligiga ishonch hosil qilishingiz kifoya.

Masalan:

{ 
  "hosting": {
    "rewrites": [{
      "source":"**",
      "destination": "/index.html"
    }]    
  }
}

Umid qilamanki, bu boshqa birovning umidsizlik va behuda vaqtini saqlab qoladi.

Baxtli kodlash...

Mavzu bo'yicha qo'shimcha o'qish:

https://firebase.google.com/docs/hosting/full-config#rewrites

Firebase CLI: sozlash bir sahifali ilova sifatida (barcha urllarni /index.html ga qayta yozing)

person Joshua Dyck    schedule 24.07.2018
comment
Siz afsonasiz - person Perniferous; 29.03.2019

IIS 10 dan foydalanayotganlar uchun buni to'g'ri qilish uchun shunday qilish kerak. Bu bilan brauzer tarixidan foydalanayotganingizga ishonch hosil qiling. Malumot uchun men marshrutlash kodini beraman, lekin bu muhim emas, muhimi quyidagi komponent kodidan keyingi qadamdir:

class App extends Component {
    render() {
        return (
            <Router history={browserHistory}>
                <div>
                    <Root>
                        <Switch>
                            <Route exact path={"/"} component={Home} />    
                            <Route path={"/home"} component={Home} />
                            <Route path={"/createnewproject"} component={CreateNewProject} />
                            <Route path={"/projects"} component={Projects} />
                            <Route path="*" component={NotFoundRoute} />
                        </Switch>
                    </Root>
                </div>
            </Router>
        )
    }
}
render (<App />, window.document.getElementById("app"));

Muammo IIS mijoz brauzerlaridan so'rovni qabul qilganligi sababli, u URLni sahifani so'rayotgandek izohlaydi, so'ngra mavjud sahifa yo'qligi sababli 404 sahifani qaytaradi. Quyidagilarni bajaring:

  1. IIS-ni oching
  2. Serverni kengaytiring va keyin Saytlar papkasini oching
  3. Veb-sayt/ilovani bosing
  4. Xato sahifalariga o'ting
  5. Ro'yxatdagi 404 xato holati elementini oching
  6. "Xato javobiga statik fayldan tarkib qo'shish" opsiyasi o'rniga uni "Ushbu saytda URL manzilini bajarish" ga o'zgartiring va URL manziliga "/" slash qiymatini qo'shing.

Va endi u yaxshi ishlaydi.

rasm tavsifini shu yerga kiriting rasm tavsifini shu yerga kiriting

Umid qilamanki, bu yordam beradi. :-)

person Martin Lloyd Jose    schedule 29.05.2018
comment
3-4 soat qidiruvdan keyin eng yaxshi yechim. katta rahmat :) - person KMR; 17.09.2020
comment
xudo sizdan rozi bo'lsin - person ArtemiZ Studio; 01.06.2021

Men reaktiv router (Apache) bilan SPA uchun yechim topdim. Faqat .htaccess-ni qo'shing

<IfModule mod_rewrite.c>

  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteRule . /index.html [L]

</IfModule>

Manba: https://gist.github.com/alexsasharegan/173878f9463878f9b

person Sasha Ignashevich    schedule 20.01.2019

Men hali server tomonini ko'rsatishdan foydalanmayapman, lekin men OP bilan bir xil muammoga duch keldim, bu erda Link ko'pincha yaxshi ishlaganday tuyuldi, lekin parametrim bo'lganida muvaffaqiyatsiz bo'ldi. Kimgadir yordam beradimi yoki yo'qligini bilish uchun men o'z yechimimni shu yerda hujjatlashtiraman.

Mening asosiy jsxim quyidagilarni o'z ichiga oladi:

<Route onEnter={requireLogin} path="detail/:id" component={ModelDetail} />

Bu birinchi mos keladigan havola uchun yaxshi ishlaydi, lekin :id ushbu modelning batafsil sahifasida joylashgan <Link> ifodalarida o'zgarganda, brauzer satrida url o'zgaradi, lekin sahifa mazmuni bog'langan modelni aks ettirish uchun dastlab o'zgarmadi.

Muammo shundaki, men modelni componentDidMount da o'rnatish uchun props.params.id dan foydalanganman. Komponent faqat bir marta o'rnatiladi, shuning uchun bu birinchi model sahifaga yopishib oladigan model ekanligini anglatadi va keyingi havolalar rekvizitlarni o'zgartiradi, lekin sahifani o'zgarishsiz qoldiradi.

Modelni componentDidMount va componentWillReceiveProps da komponent holatiga o'rnatish (bu erda u keyingi rekvizitlarga asoslangan) muammoni hal qiladi va sahifa mazmuni kerakli modelni aks ettirish uchun o'zgaradi.

person Paul Whipp    schedule 12.09.2016
comment
Komponent konstruktoridan foydalanish yaxshiroq bo'lishi mumkin (u ham props ga kirish huquqiga ega) i.s.o. componentDidMount agar siz server tomonida renderlashni sinab ko'rmoqchi bo'lsangiz. Chunki componentDidMount faqat brauzerda chaqiriladi. Uning maqsadi DOM bilan render da bajara olmaydigan body va hokazo voqealar tinglovchilarini biriktirish kabi ishlarni bajarishdir. - person Stijn de Witt; 20.12.2016

Bu mavzu biroz eski va hal qilingan, lekin men sizga oddiy, aniq va yaxshiroq yechim taklif qilmoqchiman. Agar siz veb-serverdan foydalansangiz ishlaydi.

Har bir veb-serverda http 404 bo'lsa, foydalanuvchini xato sahifasiga yo'naltirish imkoniyati mavjud. Ushbu muammoni hal qilish uchun foydalanuvchini indeks sahifasiga yo'naltirish kerak.

Agar siz Java asosiy serveridan (tomcat yoki har qanday java dastur serveri) foydalansangiz, yechim quyidagicha bo'lishi mumkin:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- WELCOME FILE LIST -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- ERROR PAGES DEFINITION -->
    <error-page>
        <error-code>404</error-code>
        <location>/index.jsp</location>
    </error-page>

</web-app>

Misol:

  • http://example.com/about SOTIB OLISH
  • Veb-server http 404-ni tashlaydi, chunki bu sahifa server tomonida mavjud emas
  • xato sahifasi konfiguratsiyasi index.jsp sahifasini foydalanuvchiga qaytarib yuboradigan serverga xabar beradi
  • keyin JS qolgan ishni mijoz tomonida bajaradi, chunki mijoz tomonidagi url hali ham http://example.com/about.

Mana, boshqa sehr kerak emas :)

person zappee    schedule 15.01.2017
comment
Bu ajoyib edi! Men Wildfly 10.1 serveridan foydalanmoqdaman va bu yangilanishni web.xml faylimga qildim, faqat joylashuvim faqat “/” ga oʻrnatilgan edi. Buning sababi, mening reaktsiya kodimda brauzer tarixini shunday ishlatganman: const browserHistory = useRouterHistory(createHistory)({ basename: '/<appname>' }); - person Chuck L; 02.06.2017
comment
Bu SEOga ta'sir qilmasligiga ishonchingiz komilmi? Siz haqiqatda mavjud bo'lgan sahifalarga 404 statusini berasiz. Foydalanuvchi buni hech qachon anglamasligi mumkin, lekin botlar juda ko'p e'tibor berishadi, aslida ular sizning sahifangizni qirib tashlamaydilar. - person subharb; 15.12.2017

Agar siz backend-da Express yoki boshqa ramkadan foydalanayotgan bo'lsangiz, shunga o'xshash konfiguratsiyani qo'shishingiz va konfiguratsiyadagi Webpack umumiy yo'lini tekshirishingiz mumkin, agar siz BrowserRouter-dan foydalanayotgan bo'lsangiz, u qayta yuklanganda ham yaxshi ishlashi kerak.

expressApp.get('/*', (request, response) => {
    response.sendFile(path.join(__dirname, '../public/index.html'));
});
person neeraj-dixit27    schedule 09.03.2018
comment
bu eng oddiy yechim. Bu marshrut boshqa har qanday marshrutdan keyin borishi kerakligini unutmang, chunki bu hamma uchun mos - person dcsan; 14.02.2020

Yangilanganda yoki to'g'ridan-to'g'ri URLga qo'ng'iroq qilishda "/URL olinmaydi" xatosini tuzatish.

Berilgan havolani shunday marshrutlarni kutish uchun webpack.config.jsni sozlang.

module.exports = {
  entry: './app/index.js',
  output: {
       path: path.join(__dirname, '/bundle'),
       filename: 'index_bundle.js',
       publicPath: '/'
  },
person Lalit Tyagi    schedule 19.12.2018

bularning hammasini o'qib ko'rishingiz mumkin, garchi bu meniki emas:

https://www.andreasreiterer.at/fix-browserrouter-on-Apache/

Ilovaning marshrutini tuzatish Endi mana nihoyat marshrutlashni qanday tuzatish kerak. Apache-ga so'rovlarni bizning ilovamiz joylashgan index.html ga yo'naltirishni aytish uchun biz .htaccess faylini o'zgartirishimiz kerak. Agar ilovangiz papkasida hali bunday fayl bo'lmasa, uni yarating.

Keyin marshrutingizni sehrli tarzda ishlaydigan 4 qatorni qo'yganingizga ishonch hosil qiling.

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]

Ushbu .htaccess faylini index.html bilan bir xil katalogga joylashtirganimizdan so'ng, Apache har bir yangi so'rovni to'g'ridan-to'g'ri ilovangizga yo'naltiradi.

Bonus: React ilovasini pastki katalogga joylashtirish

Agar siz ilovangizni pastki katalogga joylashtirayotgan bo'lsangiz, unga kirish mumkin bo'ladi, masalan. https://myapp.com/the-app orqali siz tez orada yana bir borligini sezasiz. nashr. Yangi marshrutga har bir bosish URL manzilini https://myapp.com/route-abcga o‘zgartiradi. a> – qayta yuklangandan keyin yana buziladi. Ammo buning uchun oddiy tuzatish mavjud:

BrowserRouter-da taglik nomi deb ataladigan rekvizit mavjud bo'lib, u erda siz pastki katalog yo'lini belgilashingiz mumkin:

From now on, each Route like /contacts will result in an URL like http://myapp.com/the-app/contacts.

person Rishabh Jain    schedule 14.10.2019
comment
Bu CRA-ni boshqa katalogdan ishga tushirishni istaganlar uchun juda oddiy tuzatish. Men react-router-dom dan foydalanmoqdaman, shuning uchun <BrowserRouter /> ga basename ni kiritishim kerak edi. Ammo bu oddiy tuzatish sizga ko'p vaqtni tejaydi. Ushbu hissa uchun rahmat! - person Josh Cronkhite; 17.09.2020
comment
rahmat. Sizning yechimingiz mening vaqtimni tejaydi. :) - person Adnan Ahmad; 18.11.2020
comment
Men yordam bera olganimdan xursandman .. :) - person Rishabh Jain; 09.12.2020

HashRouter dan foydalanish men uchun Redux bilan ham ishladi, shunchaki almashtiring:

import {
  Router //replace Router
} from "react-router-dom";

ReactDOM.render(
    <LocaleProvider locale={enUS}>
    <Provider store={Store}>
        <Router history={history}> //replace here saying Router
            <Layout/>
        </Router>
    </Provider>
</LocaleProvider>, document.getElementById("app"));
registerServiceWorker();

to:

import {
  HashRouter //replaced with HashRouter
} from "react-router-dom";

ReactDOM.render(
    <LocaleProvider locale={enUS}>
    <Provider store={Store}>
        <HashRouter history={history}> //replaced with HashRouter
            <Layout/>
        </HashRouter>
    </Provider>
</LocaleProvider>, document.getElementById("app"));
registerServiceWorker();
person Alireza    schedule 24.03.2020

Agar siz create-react-app buyrug'idan foydalansangiz,

reaksiya ilovasini yaratish uchun brauzerda React SPA ishlab chiqarishni to'g'ri ishga tushirish uchun package.json faylida bitta o'zgarish bo'lishi kerak. package.json faylini oching va unga quyidagi kod segmentini qo'shing,

"start": "webpack-dev-server --inline --content-base . --history-api-fallback"

Bu erda eng muhim qism --history-api-fallback tarixi API qo'ng'iroqlarini faollashtirishdir.

Ba'zan siz Spring yoki boshqa API-dan foydalansangiz, 404 xatosiga duch kelasiz. Shunday qilib, bunday vaziyatda react-router tomonidan ishlov berish uchun har qanday so'rovni (siz xohlagan) index.html fayliga yo'naltirish uchun orqa tomonda kontroller bo'lishi kerak. Quyida bahor yordamida yozilgan boshqaruvchi misolini ko'rsating.

@Controller
public class ForwardingController {
    @RequestMapping("/<any end point name>/{path:[^\\.]+}/**")
    public String forward(HttpServletRequest httpServletRequest) {
        return "forward:/";
    }
}

Masalan, agar biz API REST so'nggi nuqtasini abc (http://localhost:8080/abc/**) sifatida olsak, ushbu so'nggi nuqtaga keladigan har qanday so'rov ilovani (index.html fayli) reaktsiyaga yo'naltiradi va reaksiya- Router bu so'zlarni boshqaradi.

person Malinda    schedule 30.01.2020
comment
Shu kabi bir nechta xaritalarni ham qoʻshishingiz mumkin: @RequestMapping({/myurl1/**, /myurl2/**}) - person Craigo; 17.12.2020

Agar kimdir bu erda Laravel bilan React JS SPA bo'yicha yechim izlayotgan bo'lsa. Qabul qilingan javob bu kabi muammolar nima uchun yuzaga kelishini eng yaxshi tushuntirishdir. Yuqorida aytib o'tilganidek, siz mijoz tomonini ham, server tomonini ham sozlashingiz kerak. Blade shabloningizga js to'plami faylini qo'shing, shunga o'xshash URL facade dan foydalaning.

<script src="{{ URL::to('js/user/spa.js') }}"></script>

Marshrutlaringizda buni pichoq shablonining asosiy so'nggi nuqtasiga qo'shganingizga ishonch hosil qiling. Masalan,

Route::get('/setting-alerts', function () {
   return view('user.set-alerts');
});

Yuqoridagilar pichoq shablonining asosiy yakuniy nuqtasidir. Endi ixtiyoriy marshrutni ham qo'shing,

Route::get('/setting-alerts/{spa?}', function () {
  return view('user.set-alerts');
});

Muammo shundaki, avval pichoq shabloni yuklanadi, so'ngra reaktsion router. Shunday qilib, siz '/setting-alerts' ni yuklayotganingizda, u html va js ni yuklaydi. Lekin '/setting-alerts/about' ni yuklaganingizda, u avval server tomonida yuklanadi. Server tomonida bu joyda hech narsa yo'qligi sababli, u topilmadi. Agar sizda ixtiyoriy yo'riqnoma mavjud bo'lsa, u o'sha sahifani yuklaydi va reaktiv yo'riqnoma ham yuklanadi, keyin reaksiya yuklovchi qaysi komponentni ko'rsatishni hal qiladi. Umid qilamanki, bu yordam beradi.

person Koushik Das    schedule 14.11.2017
comment
Serverga bitta aniq URI ga yuklash mumkinmi, keyin server React-ga yo'naltiradi? Misol uchun, men /user/{userID} ni yuklaganimda, men universal /user HTML ko'rinishini qaytarishim kerak, identifikatorni olib kelib, AJAX yoki axios yordamida chaqirishim kerak. Buni qilish mumkinmi? ular SEOga mos keladimi? - person Ryuujo; 22.02.2019
comment
Men ushbu kodni Laravel backendli SPA-larim uchun ishlataman: Route::any('{any?}', 'MyController@index'); U har qanday marshrutga mos keladi va uni SPAga uzatadi - person Felix Geenen; 08.09.2020

Men .Net Core MVC dan foydalanar ekanman, menga shunday narsa yordam berdi:

    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            var url = Request.Path + Request.QueryString;
            return App(url);
        }

        [Route("App")]
        public IActionResult App(string url)
        {
            return View("/wwwroot/app/build/index.html");
        }
   }

Asosan MVC tomonida, mos kelmaydigan barcha marshrutlar startup.cs da ko'rsatilgandek Home/Index ga tushadi. Index ichida asl so'rov url-ni olish va kerakli joyga yuborish mumkin.

startup.cs

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });
person Elnoor    schedule 11.03.2019
comment
Agar veb-api ilovadan ajratilgan bo'lsa, buni qanday hal qilasiz? - person Dayán Ruiz; 01.05.2019
comment
@dayanrr91 agar loyihangizda veb-api bo'lsa, sizga baribir server tomonini yo'naltirish kerak bo'lmaydi. Va menimcha, reaktsion-routeringiz urlni o'qib, tegishli marshrutni amalga oshirishi kerak. Hech narsa uni to'sib qo'ymasligi kerak - person Elnoor; 01.05.2019
comment
sizning sharhingiz juda qadrlanadi, lekin keyin menda savol bor, men hozirgina HashRouter-ni qo'shdim, lekin endi men istalgan URL-ga qo'lda kirsam, u mening uyimga yo'naltirish o'rniga mening uy komponentimga yo'naltiriladi va keyin men harakat qilgan komponentga yo'naltiriladi. kirish, buning uchun vaqtinchalik echim bormi? - person Dayán Ruiz; 01.05.2019
comment
@dayanrr91 hech qanday tasavvurga ega emasman, men hech qachon heshrouterni sinab ko'rmaganman, lekin sizning kodingiz bilan bog'liq bo'lishi kerak deb o'ylayman. Heshrouterning ishlash usuli brauzer routerga o'xshash bo'lishi kerak. Bundan tashqari, men hozirgina ushbu sinov muhitida sinab ko'rdim, u yaxshi ishlaydi codesandbox.io/s/25okp1mny, sinab ko'ring url 25okp1mny.codesandbox.io/#/roster/5 - person Elnoor; 01.05.2019

Agar siz IISda hosting qilsangiz; Buni veb-konfiguratsiyaga qo'shish mening muammomni hal qildi

<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
    <remove statusCode="500" subStatusCode="100" />
    <remove statusCode="500" subStatusCode="-1" />
    <remove statusCode="404" subStatusCode="-1" />
    <error statusCode="404" path="/" responseMode="ExecuteURL" />
    <error statusCode="500" prefixLanguageFilePath="" path="/error_500.asp" responseMode="ExecuteURL" />
    <error statusCode="500" subStatusCode="100" path="/error_500.asp" responseMode="ExecuteURL" />
</httpErrors>

Siz boshqa har qanday server uchun shunga o'xshash konfiguratsiya qilishingiz mumkin

person Barny    schedule 26.04.2017

IIS Virtual Katalogidan (veb-sayt ildizi emas) reaksiya ilovasiga xizmat koʻrsatishga harakat qilayotganingiz uchun shu yerda boʻlganlar uchun bu siz uchun boʻlishi mumkin.

Qayta yo'naltirishlaringizni o'rnatishda "/" o'z-o'zidan ishlamaydi, men uchun u erda virtual katalog nomi ham kerak edi. Mana mening veb-konfiguratsiyam qanday ko'rinishga ega edi:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <files>
                <remove value="default.aspx" />
                <remove value="iisstart.htm" />
                <remove value="index.htm" />
                <remove value="Default.asp" />
                <remove value="Default.htm" />
            </files>
        </defaultDocument>
        <rewrite>
            <rules>
                <rule name="React Routes" stopProcessing="true">
                    <match url=".*" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/YOURVIRTUALDIRECTORYNAME/" />
                </rule>
            </rules>
        </rewrite>
        <directoryBrowse enabled="false" />
        <httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
            <remove statusCode="500" subStatusCode="100" />
            <remove statusCode="500" subStatusCode="-1" />
            <remove statusCode="404" subStatusCode="-1" />
            <remove statusCode="403" subStatusCode="18" />
            <error statusCode="403" subStatusCode="18" path="/YOURVIRTUALDIRECTORYNAME/" responseMode="ExecuteURL" />
            <error statusCode="404" path="/YOURVIRTUALDIRECTORYNAME/" responseMode="ExecuteURL" />
            <error statusCode="500" prefixLanguageFilePath="" path="/YOURVIRTUALDIRECTORYNAME/" responseMode="ExecuteURL" />
            <error statusCode="500" subStatusCode="100" path="/YOURVIRTUALDIRECTORYNAME/" responseMode="ExecuteURL" />
        </httpErrors>
    </system.webServer>
</configuration>

Web.config fayliga qo'shimcha ravishda reaksiya ilovasining o'zi ham ba'zi o'zgarishlarni talab qiladi:

package.json da siz "bosh sahifa" yozuvini qo'shishingiz kerak:

{
  "name": "sicon.react.crm",
  "version": "0.1.0",
  "private": true,
  "homepage": "/YOURVIRTUALDIRECTORYNAME/",
  "dependencies": {
...

Tarixga kirish uchun routerga o'tkazadigan brauzer tarixi ob'ektiga asosiy nomni qo'shdim:

import  {createBrowserHistory } from 'history';

export default createBrowserHistory({
    //Pass the public URL as the base name for the router basename: process.env.PUBLIC_URL
});

Men ushbu xususiyatni App.js-dagi React routerimga ham qo'shdim:

  <Router history={history} basename={process.env.PUBLIC_URL}>

Nihoyat, index.html da "title" tegi ustiga quyidagi yorliqni qo'shdim

  <base href="%PUBLIC_URL%/">

Eslatma talab qilinadigan ba'zi qadamlar bo'lishi mumkin, lekin bu men uchun ishni bajarganga o'xshaydi. Men uni saytning ildizida yoki virtual katalogda qayta kompilyatsiya qilmasdan ishlash uchun qanday sozlashni bilmayman, lekin men bilganimdek, package.json dagi bosh sahifani qurishdan keyin almashtirib bo'lmaydi.

person WraithNath    schedule 19.07.2020
comment
Sizning postingizdagi oxirgi ikkita kod satri meni qutqardi. Rahmat! basename <Router /> va <base /> indeksi.html. - person Craig Howell; 28.04.2021
comment
@CraigHowell - Bu yordam berganidan xursandman! Men ham o'zimni eslatish uchun ushbu postga qaytdim! - person WraithNath; 30.04.2021

Haqiqatan ham ajoyib javoblar !! Lekin agar siz nginx-dan foydalanayotgan bo'lsangiz va tezkor tuzatish kerak bo'lsa... joylashuv blokidagi nginx konfiguratsiyasiga quyidagi qatorni qo'shing.

location / {
  try_files $uri /index.html;
}
person BeK    schedule 18.03.2021

Joshua Deykning javobiga qoʻshimcha maʼlumot qoʻshilmoqda.

Agar siz Firebase-dan foydalanayotgan bo'lsangiz va ildiz yo'nalishi va pastki katalog marshrutidan foydalanmoqchi bo'lsangiz, firebase.json-ga quyidagi kodni qo'shishingiz kerak:

{
  "hosting": {
    "rewrites": [
      {
        "source": "*",
        "destination": "/index.html"
      },
      {
        "source": "/subdirectory/**",
        "destination": "/subdirectory/index.html"
      }
    ]
  }
}

Misol:

Siz mijoz uchun veb-sayt qurmoqdasiz. Siz veb-sayt egasidan https://your.domain.com/management sahifasiga ma'lumot qo‘shishini xohlaysiz. veb-sayt foydalanuvchilari esa https://your.domain.com saytiga o'tishadi.

Bunday holda, firebase.json faylingiz shunday ko'rinadi:

{
  "hosting": {
    "rewrites": [
      {
        "source": "*",
        "destination": "/index.html"
      },
      {
        "source": "/management/**",
        "destination": "/management/index.html"
      }
    ]
  }
}
person neomib    schedule 12.03.2019

Men WebPack-dan foydalanmoqdaman, menda bir xil muammo bor edi. Solution=> Sizning server.js faylingizda

const express = require('express');
const app = express();

app.use(express.static(path.resolve(__dirname, '../dist')));
  app.get('*', function (req, res) {
    res.sendFile(path.resolve(__dirname, '../dist/index.html'));
    // res.end();
  });

Nima uchun Mening ilovam yangilangandan keyin ko'rsatilmaydimi?

person Vishal Singh    schedule 19.02.2019
comment
Bu men uchun buni qildi! Dastlab menda res.sendFile(path.JOIN(publicPath, index.html)); Yuqoridagi misoldagi kabi birlashishni hal qilinganga o'zgartirdim: res.sendFile(path.resolve(./dist, index.html)); Men __dirname bilan ham oʻynagan edim, lekin uni tushuna olmadim yoki ishlay olmadim, shuning uchun ./dist ga qoʻlda nusxa koʻchirdim, chunki mening index.html manzilim shu erdan taqdim etiladi. Men buni avvalgidek e'lon qildim: app.use(express.static(./dist)); - person logixplayer; 10.05.2020

Biz express' 404 ishlov berish usulidan foydalandik.

// path to the static react build directory    
const frontend = path.join(__dirname, 'react-app/build');

// map the requests to the static react build directory
app.use('/', express.static(frontend));

// all the unknown requests are redirected to the react SPA
app.use(function (req, res, next) {
    res.sendFile(path.join(frontend, 'index.html'));
});

Jozibasi kabi ishlaydi. Jonli demo - bu bizning saytimiz

person Zameer Ansari    schedule 22.09.2019
comment
bu men uchun ishladi, javobingiz uchun rahmat! - person Apostolos; 13.05.2021

Men bu muammoni webpack.config.js ni o'zgartirish orqali hal qildim.

mening yangi konfiguratsiyam quyidagicha ko'rinadi:

Oldin:

output: {
  path: path.join(__dirname, '/build/static/js'),
  filename: 'index.js'
},


devServer: {
  port: 3000
}

Keyingi:

output: {
  path: path.join(__dirname, '/build/static/js'),
  filename: 'index.js',
  publicPath: '/'
},


devServer: {
  historyApiFallback: true,
  port: 3000
}
person Sunil Kumar Singh    schedule 29.04.2020

Agar siz uni Google Bucket-da ishlatayotgan bo'lsangiz, buning oddiy yechimi Xato (404 topilmadi) sahifasi uchun "index.html" ni ko'rib chiqishdir.

To do so:

  1. Chelaklar ro'yxatida siz yaratgan chelakni toping.
  2. Paqir bilan bog'langan paqirni to'ldirish menyusini (...) bosing va Veb-sayt konfiguratsiyasini tahrirlash-ni tanlang.
  3. Veb-sayt konfiguratsiyasi dialog oynasida xato sahifasi sifatida asosiy sahifani ham belgilang.
person Sansei    schedule 16.07.2020
comment
Bu men uchun ishlamaydi - person Md. Parvez Alam; 16.12.2020

React/router bilan backend va frontendda React (react-create-appsiz) yordamida to'g'ri kirish/router marshruti reaksiya komponenti ko'rsatiladi va manzil satrida enter tugmasini bosganingizda menyu havolasi faol uslubga o'rnatiladi. masalan, http://localhost:8050/pages. Iltimos, quyida hisob-kitob qiling yoki to‘g‘ridan-to‘g‘ri mening repomga https://github.com/nickjohngray/staticbackeditor, hammasi kod mavjud.

Veb-paket:

Proksi-serverni sozlash. Bu 3000 (React) portidan har qanday qo'ng'iroqlarga serverga qo'ng'iroq qilish imkonini beradi, shu jumladan enter tugmasi bosilganda index.html yoki manzil satridagi biror narsani olish uchun qo'ng'iroq. shuningdek, JSON ma'lumotlarini olish uchun API marshrutiga qo'ng'iroqlarga ruxsat beradi

await axios.post('/api/login', {email, pwd}) kabi

devServer: {
    port: 3000,
    open: true,
    proxy: {
      '/': 'http://localhost:8050',
    }
  }

Ekspress marshrutlarni sozlang

app.get('*', (req, res) => {
    console.log('sending index.html')
    res.sendFile(path.resolve('dist', 'index.html'))

});

Bu reaktsiyadan kelgan har qanday so'rovga mos keladi, u shunchaki mening dist papkamda joylashgan index.html sahifasini qaytaradi, albatta, bu sahifada yana bir sahifali reaksiya ilovasi mavjud. (boshqa marshrutlar yuqorida ko'rinishi kerakligiga e'tibor bering, mening holimda bu mening API marshrutlarim)

Reaksiya marshrutlari

<Router>
    <Home path="/" />
    <Pages path="pages"/>
    <ErrorPage path="error"/>
    <Products path="products"/>
    <NotFound default />
</Router>

Ushbu marshrutlar mening Layout komponentimda belgilangan, ular yo'l mos kelganda tegishli komponentni yuklaydi.

React Layout konstruktori

 constructor(props) {
        super(props);


        this.props.changeURL({URL: globalHistory.location.pathname});
}

Layout konstruktori yuklanishi bilanoq chaqiriladi. Bu erda men menyum tinglaydigan redux amalimni changeURL deb nomlayman, shunda u quyidagi kabi to'g'ri menyu bandini ajratib ko'rsatishi mumkin:

Menyu kodi

<nav>
    {this.state.links.map( (link) =>
    <Link className={this.getActiveLinkClassName(link.path) } to={link.path}> 
      {link.name}
    </Link>)}            
</nav>
person nick    schedule 08.08.2020

Mening holimda parametrni ishlatganimda url yuklanmadi.

Tezkor tuzatish sifatida Build jildidagi index.html fayl tegi ostiga <base href="<yourdomain/IP>"></base> ni qo'shdim.

Va bu mening muammomni hal qildi.

person Diwakar Prasad    schedule 02.02.2021

Menda xuddi shunday muammo bor edi va bu yechim biz uchun ishladi..

Fon:

Biz bir xil serverda bir nechta ilovalarni joylashtiramiz. Biz yangilaganimizda, server ushbu ilova uchun dist papkasida indeksimizni qayerdan qidirishni tushunolmaydi. Yuqoridagi havola sizni biz uchun nima ishlaganiga olib boradi... Umid qilamanki, bu yordam beradi, chunki biz o'z ehtiyojlarimiz uchun yechim topishga ancha vaqt sarfladik.

Biz foydalanamiz:

package.json

"dependencies": {
"babel-polyfill": "^6.23.0",
"ejs": "^2.5.6",
"express": "^4.15.2",
"prop-types": "^15.5.6",
"react": "^15.5.4",
"react-dom": "^15.5.4",
"react-redux": "^5.0.4",
"react-router": "^3.0.2",
"react-router-redux": "^4.0.8",
"redux": "^3.6.0",
"redux-persist": "^4.6.0",
"redux-thunk": "^2.2.0",
"webpack": "^2.4.1"
}

mening webpack.config.js

webpack.config.js

/* eslint-disable */
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const babelPolyfill = require('babel-polyfill');
const HTMLWebpackPluginConfig = new HtmlWebpackPlugin({
  template: __dirname + '/app/views/index.html',
  filename: 'index.html',
  inject: 'body'
});

module.exports = {
  entry: [
    'babel-polyfill', './app/index.js'
  ],
  output: {
    path: __dirname + '/dist/your_app_name_here',
    filename: 'index_bundle.js'
  },
  module: {
    rules: [{
      test: /\.js$/,
      loader: 'babel-loader',
      query : {
          presets : ["env", "react", "stage-1"]
      },
      exclude: /node_modules/
    }]
  },
  plugins: [HTMLWebpackPluginConfig]
}

mening index.js

index.js

import React from 'react'
import ReactDOM from 'react-dom'
import Routes from './Routes'
import { Provider } from 'react-redux'
import { createHistory } from 'history'
import { useRouterHistory } from 'react-router'
import configureStore from './store/configureStore'
import { syncHistoryWithStore } from 'react-router-redux'
import { persistStore } from 'redux-persist'

const store = configureStore();

const browserHistory = useRouterHistory(createHistory) ({
  basename: '/your_app_name_here'
})
const history = syncHistoryWithStore(browserHistory, store)

persistStore(store, {blacklist: ['routing']}, () => {
  console.log('rehydration complete')
})
// persistStore(store).purge()


ReactDOM.render(
    <Provider store={store}>
      <div>
        <Routes history={history} />
      </div>
    </Provider>,
  document.getElementById('mount')
)

mening app.js

var express = require('express');
var app = express();

app.use(express.static(__dirname + '/dist'));
// app.use(express.static(__dirname + '/app/assets'));
app.set('views', __dirname + '/dist/your_app_name_here');
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

app.get('/*', function (req, res) {
    res.render('index');
});

app.listen(8081, function () {
  console.log('MD listening on port 8081!');
});
person J. Parrish    schedule 05.05.2017

Menga bunday munosabatda bo'lish yoqadi. Ushbu muammodan xalos bo'lish uchun server tomonida yourSPAPageRoute/* ni qo'shib ko'ring.

Men ushbu yondashuvdan foydalandim, chunki hatto mahalliy HTML5 History API ham sahifani yangilashda to'g'ri yo'naltirishni qo'llab-quvvatlamaydi (mening bilishimcha).

Eslatma: Tanlangan javob allaqachon bunga javob bergan, ammo men aniqroq bo'lishga harakat qilaman.

Ekspress marshrut

Test - History API Sinovdan o'tgan va shunchaki buni baham ko'rmoqchi bo'ldim.

Umid qilamanki, bu yordam beradi.

person Rehan    schedule 05.12.2018

Sizda quyidagi Uy marshruti ta'rifiga ega deb hisoblang

<Route exact path="/" render={routeProps => (
   <Home routeProps={routeProps}/>
)}/>

{/*optional catch-all router */}
<Route render={routeProps => (
       <div><h4>404 not found</h4></div>
)}/>

Home komponentingizda siz ComponentWillMount hodisasida so'rovni to'xtatib qo'yishingiz mumkin,

const searchPath = this.props.routeProps.location.search;

if (searchPath){
    this.props.routeProps.history.push("/" + searchPath.replace("?",""));
}
else{
    /*.... originally Home event */
}

Endi, url manzilida /joblist ga qo'ng'iroq qilish o'rniga, /?joblist ni so'rashingiz mumkin va Komponent so'rovni avtomatik ravishda /joblist ga yo'naltiradi (yo'lda qo'shimcha savol belgisiga e'tibor bering)

person user2674595    schedule 09.07.2019

Agar siz bu erga kelsangiz va apache dan foydalansangiz va .htaccess fayliga ega bo'lmasangiz, bu men uchun ishlagan konfiguratsiya fayli:

sites-enabled/somedomain.com.conf

<VirtualHost *:80>
    ServerName somedomain.com
    ServerAlias *.somedomain.com
    DocumentRoot /www/somedomain.com/build

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /www/somedomain.com/build/index.html [L,NC,QSA]

</VirtualHost>
person DevB2F    schedule 16.07.2019

Preact-router bilan Preact uchun yechim

Yangilanish va to'g'ridan-to'g'ri kirish bilan ishlaydi

Buni Google orqali kashf qilganlar uchun bu erda preact-router + hash tarixining demosi:

const { h, Component, render } = preact; /** @jsx h */
const { Router } = preactRouter;
const { createHashHistory } = History;
const App = () => (
    <div>
        <AddressBar />

        <Router history={createHashHistory()}>
            <div path="/">
                <p>
                    all paths in preact-router are still /normal/urls.
                    using hash history rewrites them to /#/hash/urls
                </p>
                Example: <a href="/uz/page2">page 2</a>
            </div>
            <div path="/page2">
                <p>Page Two</p>
                <a href="/uz/">back to home</a><br/>
            </div>
        </Router>
    </div>
);

jsfiddle

person keemor    schedule 05.10.2017

Serverda biror narsani o'zgartirishni talab qilmaydigan men topdim.

Aytaylik, sizning saytingiz mysite.com va sizda mysite.com/about ga React Route bor. Yuqori darajadagi komponentni o'rnatadigan index.js da siz boshqa Routerni qo'yishingiz mumkin:

ReactDOM.render(
<Router>
    <div>
        <Route exact path="/" component={Home} />
        <Route exact path="/about"
            render={(props) => <Home {...props} refreshRout={"/about"}/>}
        />
    </div>
</Router>,

O'ylaymanki, sizda virtual DOMdagi yuqori darajadagi komponentdan pastda joylashgan original Router mavjud. Agar siz Django-dan foydalanayotgan bo'lsangiz, .url-dagi url-ni ham olishingiz kerak:

urlpatterns = [
       path('about/', views.index),
]

Biroq, bu qaysi backend foydalanayotganingizga bog'liq bo'ladi. Mysite/about soʻrovi sizni index.js (yuqori darajali komponentni oʻrnatadigan) ga olib boradi, bu yerda komponent tayanchidan koʻra Marshrutning render tayanchidan foydalanishingiz va “/about” ni tayanch sifatida oʻtkazishingiz mumkin. bu misol, Home komponenti.

Home ichida komponentDidMount() yoki useEffect() kancasida quyidagilarni bajaring:

useEffect() {   
   //check that this.props.refreshRoute actually exists before executing the 
   //following line    
   this.props.history.replace(this.props.refreshRoute);
}

Men sizning Home komponentingiz quyidagi kabi narsalarni ko'rsatmoqda deb taxmin qildim:

<Router>
   <Route exact path="/" component={SomeComponent} />
   <Route path="/about" component={AboutComponent} />
</Router>

Kredit (React Router tomonidan taqdim etilgan komponentga rekvizitlarni uzatish) Marshrutlardagi komponentlarga rekvizitlarni qanday o'tkazish haqida.

person Stevie    schedule 28.07.2019

Men .Net Core 3.1 dan foydalanmoqdaman va hozirgina MapFallbackToController kengaytmasini qo'shdim:

startup.cs

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");

        endpoints.MapFallbackToController("Index", "Home");
    });
person Sergio    schedule 08.05.2020

Darhol url manziliga yo'naltirayotgan bo'lsangiz ham ma'lumotlarni so'rashning boshqa usuli - har bir komponentda /about/test kabi oxirgi parametrlarga, so'ngra Davlat provayderingizga qo'ng'iroq qiladigan usulga ega bo'lishdir. ma'lumot so'ramoqchi bo'lgan komponentga ulanadi

person Vince    schedule 04.06.2020

Men React.js + Webpack rejimidan foydalanmoqdaman. package.json faylga --history-api-fallback parametrini qo'shdim. Keyin sahifani yangilash to'g'ri ishlaydi. Har bir kodni o'zgartirganimda, veb-sahifa avtomatik ravishda yangilanadi.

"scripts": {
  "start": "rimraf build && cross-env NODE_ENV='development' webpack --mode development && cross-env NODE_ENV=development webpack-dev-server --history-api-fallback",
  ...
}
person NinjaDev    schedule 12.08.2020

Men bu savolga o'limga javob berilganini bilaman, lekin bu sizning brauzeringiz routeringizdan proksi pass bilan foydalanmoqchi bo'lgan muammoni hal qilmaydi, bu erda siz rootdan foydalana olmaysiz.

Men uchun yechim juda oddiy.

sizda qandaydir portga ishora qiluvchi url borligini ayting.

location / {
  proxy_pass http://127.0.0.1:30002/;
  proxy_set_header    Host            $host;
  port_in_redirect    off;
}

va endi brauzer tufayli routerning pastki yo'llari buzilgan. Biroq, siz pastki yo'llar nima ekanligini bilasiz.

Buning yechimi? /contact pastki yo'l uchun

# just copy paste.
location /contact/ {
  proxy_pass http://127.0.0.1:30002/;
  proxy_set_header    Host            $host;
}

Men sinab ko'rgan boshqa hech narsa ishlamadi, lekin bu oddiy tuzatish la'nat jozibasi kabi ishlaydi.

person danieltan95    schedule 09.11.2020

Front-end uchun React va marshrutlash uchun react-router-dom dan foydalanganimda Electronda bu muammoga duch kelganman. Men BrowserRouter ni HashRouter bilan almashtirdim va u tuzatildi. Mana oddiy misol

import {
  HashRouter as Router,
  Switch,
  Route,
} from "react-router-dom";
person Sanan Ali    schedule 03.06.2021
comment
HashRouter-dan foydalanishning hojati yo'q, menda buning yechimi bor, yaqinda loyihada bu muammoga duch keldim, ehtimol vaqtim bo'lganda javob yozaman - person Inzamam Malik; 10.07.2021
comment
Albatta, men sizning yechimingizni bilmoqchiman. - person Sanan Ali; 12.07.2021

HashRouter oson amalga oshiriladi,

import {HashRouter as Router,Switch,Route,Link} from 'react-router-dom';


  function App() {
  return (
    <Router>
        <Switch>
          <Route path="/" exact component={InitialComponent} />
          <Route path="/some" exact component={SomeOtherComponent} />
        </Switch>
      </Router>
  );
}

Bu brauzerda shunday bo'ladi - http:localhost:3000/#/ , http:localhost:3000/#/some

person lakjeewa Wijebandara    schedule 10.07.2021

Dom komponentini yangilaganingizdan so'ng 403 xatosini qabul qila olmaysiz. veb-paket konfiguratsiyasiga ushbu bitta qatorni qo'shing, "historyApiFallback: true ". Bu butun kunimni saqlaydi.

person praveenkumar s    schedule 02.01.2018

Misol bilan to'liq marshrutizator (React Router v4):

Ishlash namunasi Quyidagi loyihani ko'rib chiqing.

react-router-4-example

Yuklab olingandan so'ng
1.) loyihani o'rnatish uchun cmd-da "npm install"
2.) reaktsiya ilovangizni ishga tushirish uchun "npm start"

Eslatma: Windowsda ishlash uchun Node js dasturi kerak. Mac OS da standart tugun mavjud.

Assalomu alaykum

person Muthu Kumar    schedule 29.01.2019