Je viens d'activer le mode historique du routeur Vue. Et ça marche bien quand je visite vue routage via v-href ou href. Mais lorsque j'essaie d'actualiser cette page ou d'aller directement à partir de la barre d'adresse du navigateur, il renvoie simplement 404. Existe-t-il une option permettant d'accepter l'actualisation/la consultation de cette URL?
Voici la configuration de mon routeur Vue
var router = new VueRouter({
hashbang: false,
history: true,
mode: 'html5',
linkActiveClass: "active",
root: '/user'
});
En actualisant la page, vous faites une demande au serveur avec l'URL actuelle et le serveur renvoie 404. Vous devez gérer cela sur votre infrastructure Web ou au niveau du serveur Web.
Je pense que vous manquez que SPA n'est pas rendu sur le serveur. Au moins pour la majorité. Ainsi, lorsque vous accédez à/quoi que ce soit, votre serveur Web ne le redirigera pas vers index.html. Cependant, si vous cliquez sur n’importe quel lien de routeur vuejs, cela fonctionnera car javascript est actif, mais pas du côté serveur.
Pour résoudre ce problème, utilisez .htaccess et redirigez toutes les requêtes vers index.html comme suit
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</ifModule>
J'espère que ça aide quelqu'un!
Si quelqu'un traite ce problème dans .NET Core en tant que backend de l'application, une approche agréable est un simple gestionnaire de secours dans le fichier Startup.cs de notre application .NET Core:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....Your configuration
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
//handle client side routes
app.Run(async (context) =>
{
context.Response.ContentType = "text/html";
await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html"));
});
}
}
Pour plus de détails: http://blog.manuelmejiajr.com/2017/10/letting-net-core-handle-client-routes.html
Toute autre personne confrontée au même problème, je viens de me rendre compte que
"book/:bookId/read" // this will not work after page reload
et c'est différent
"/book/:bookId/read" // this is what works even after page reload
C’est bien sûr après avoir suivi ce que d’autres types ont suggéré plus haut encore: capturer tous les itinéraires du côté de votre serveur d’applications. En fait, je ne sais pas pourquoi cela a fonctionné, mais tous ceux qui ont des idées peuvent nous le faire savoir.
Pour ceux qui voient cela en utilisant un backend Express, il existe le middleware connect-history-api-fallback qui est implémenté comme ceci
const express = require('express');
const history = require('connect-history-api-fallback');
const app = express();
app.use(history({
index: '/' //whatever your home/index path is default is /index.html
}));
Ou avec un nœud natif
const http = require('http')
const fs = require('fs')
const httpPort = 80
http.createServer((req, res) => {
fs.readFile('index.htm', 'utf-8', (err, content) => {
if (err) {
console.log('We cannot open "index.htm" file.')
}
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
})
res.end(content)
})
}).listen(httpPort, () => {
console.log('Server listening on: http://localhost:%s', httpPort)
})
Les deux sont des suggestions dans la documentation .