web-dev-qa-db-fra.com

Comment configurer le serveur Apache pour la route React?

Mon application de réaction fonctionne parfaitement sur mon serveur de développement local, mais cela ne fonctionnait pas lorsque je vidais mes fichiers prêts pour la production directement dans le répertoire htdocs d'Apache:

Voici ce que j'ai

/var/www/index.html
/var/www/bundle.js

et j'ai 

DocumentRoot /var/www

dans /etc/Apache2/sites-available/000-default.conf

Le fait est que 
1). quand j'accède à http: //...com/ qui m'a dirigé vers la page de connexion
2). Après avoir cliqué sur un lien 

<Link to="main"><button>Log In</button></Link>

le contenu dans le champ d'emplacement du navigateur devient:

http://...com/main

3) Maintenant, si je recharge cette URL ( http: //...com/main ), je reçois

The requested URL /main was not found on this server

Ma montée en réaction:

    <Router history={browserHistory }>
      <Route path="/" component={TopContainer}>
          <IndexRoute component={Login} />
          <Route path='main' component={MainContainer} />   
      </Route>
</Router>

Quoi d'autre me manque dans la configuration Apache?

merci

10
Mark Qian

Modifiez la configuration VirtualHost (généralement trouvée dans /etc/httpd/conf.d\vhosts.conf) en ajoutant les lignes Rewrite * suivantes:

<VirtualHost *:8080>
  ServerName example.com
  DocumentRoot /var/www/httpd/example.com

  <Directory "/var/www/httpd/example.com">
    ...

    RewriteEngine on
    # Don't rewrite files or directories
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    # Rewrite everything else to index.html to allow html5 state links
    RewriteRule ^ index.html [L]
  </Directory>
</VirtualHost>

Cela indique à Apache de servir tous les fichiers existants, mais s'ils n'existent pas, il suffit de servir /index.html plutôt qu'un 404: not found.

Réponse complète volée avec gratitude à ici

12
Hinrich

On dirait que ce lien ( https://gkedge.gitbooks.io/react-router-in-the-real/content/Apache.html ) est exactement ce dont vous avez besoin ...

Ce morceau de configuration est utile pour les SPA:

Cela indique à Apache de servir tous les fichiers existants, mais s'ils n'existent pas, il suffit de servir /index.html plutôt que 404: non trouvé

J'espère que cela résoudra votre problème!

4

La solution ci-dessus fonctionne pour Ubuntu aussi mais je me suis battu un peu avec elle alors voici les étapes nécessaires pour le faire fonctionner.

L'emplacement du fichier où vous devez placer la configuration susmentionnée est sous 

/etc/Apache2/sites-enabled

la valeur par défaut est

/etc/Apache2/sites-enabled/000-default.conf

Ensuite, vous devez vous assurer que RewriteEngine est en cours d'exécution (sinon, vous obtiendrez une erreur lors du redémarrage du serveur Apache).

Sudo a2enmod rewrite

Enfin, redémarrez le serveur Apache

Sudo /etc/init.d/Apache2 restart

Maintenant, ça devrait marcher.

Lorsque vous utilisez la configuration par défaut (la racine du site Web se trouve sous /var/www/html), il vous suffit de placer

<Directory "/var/www/html">
    RewriteEngine on
    # Don't rewrite files or directories
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    # Rewrite everything else to index.html to allow html5 state links
    RewriteRule ^ index.html [L]
</Directory>

au fichier mentionné ci-dessus sous <VirtualHost ...>

1
Matus Dubrava