Как настроить сервер Apache для маршрута React?

У меня есть приложение для работы с приложениями, которое отлично работает на моем локальном сервере-разработчике, но оно не сработало, когда я сбрасываю свои готовые файлы прямо в каталог Apache htdocs:

Вот что я имею:

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

и я имею

DocumentRoot /var/www

в /etc/apache2/sites-available/000-default.conf

Это факт
1). когда я обращаюсь к http://...com/, который перенаправил меня на страницу входа
2). После того, как я нажал ссылку

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

содержимое в поле местоположения браузера станет:

http://...comhttps://stackoverflow.com/main

3). Теперь, если я перезагружу этот URL (http://...comhttps://stackoverflow.com/main), я получил

The requested URL https://stackoverflow.com/main was not found on this server

Мой рунинг в реактиве:

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

Что еще мне не хватает в конфигурации apache?

Спасибо

Ответ 1

Измените конфигурацию VirtualHost (обычно находится в /etc/httpd/conf.d\vhosts.conf), добавив следующие строки Rewrite *:

<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>

Это говорит Apache для обслуживания любых файлов, которые существуют, но если они не существуют, просто используйте /index.html а не 404: not found.

Полный ответ с благодарностью украден отсюда

Ответ 2

Похоже, эта ссылка (https://gkedge.gitbooks.io/react-router-in-the-real/content/apache.html) именно то, что вам нужно...

Этот фрагмент конфигурации полезен для SPA:

Это заставляет Apache обслуживать любые файлы, которые существуют, но если они не существуют, просто отправьте файл /index.html вместо 404: не найдено

Надеюсь, что решит вашу проблему!

Ответ 3

Вышеупомянутое решение работает и для Ubuntu, но я немного боролся с ним, поэтому вот шаги, необходимые для его работы.

Расположение файла, в котором вам нужно разместить вышеупомянутую конфигурацию, находится под

/etc/apache2/sites-enabled

по умолчанию

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

Затем вам нужно убедиться, что RewriteEngine запущен (в противном случае вы получите ошибку при перезапуске сервера Apache).

sudo a2enmod rewrite

Наконец, перезапустите сервер Apache

sudo/etc/init.d/apache2 restart

Теперь это должно работать.

Когда вы используете конфигурацию по умолчанию (корень сайта находится в /var/www/html), тогда все, что вам нужно сделать, это разместить

<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>

в вышеупомянутый файл в разделе <VirtualHost...>

Ответ 4

Если вам нужно использовать .htaccess и подкаталог, то у меня работает следующее.

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

Ответ 5

Перейти в этот каталог

  1. /и т.д./apache2/сайты-доступны

  2. открыть файл: 000-default.conf

  3. Изменить разрешение: 777

  4. Вставить код внизу файла

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] 

  1. Перезагрузите сервер

Ответ 6

Похоже, что ни одно из опубликованных решений не решает проблему, при которой отсутствующие ресурсы неправильно возвращают 200 вместо 404, что может сделать отладку, когда некоторые файлы отсутствуют, довольно раздражающей.

Мое решение состоит в том, чтобы вместо этого посмотреть, какой тип ресурса ожидает получить запрос, поскольку браузеры будут запрашивать HTML при переходе на страницу (Firefox запрашивает text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8), но не при доступе к ресурсам после начальной загрузки (файлы JS, импортированные через <script> или, если модули ES6 запрашивают */*, файлы CSS запрашивают text/css,*/*;q=0.1, при доступе к JSON через API fetch() указывается application/json, text/plain, */* и т.д.). Полагаясь на это предположение, можно настроить Apache для обслуживания одностраничного приложения при попытке доступа к несуществующему файлу (например, по маршруту, который работает только в одностраничном приложении), не отправляя его также всякий раз, когда SPA запрашивает CSS файл, который был переименован или отсутствует JSON файл.

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

    # Browsers will specifically ask for HTML (among other things) on initial page load
    # That is, if the *user* tries to access a *nonexisting* URL, the app is loaded instead
    # but if a webpage attempts to load a missing resource it will return 404.
    # (You can still go to /myreactapp/favicon.ico, but a missing /myreactapp/favicon.png resource won't return 200)

    # if (HTTP_ACCESS.contains('text/html') && file_not_exists(REQUEST_FILENAME))
    RewriteCond %{HTTP_ACCEPT} text/html
    RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.html [last]

    # Any ressources loaded by index.html should behave correctly (i.e: Return 404 if missing)
    RewriteRule ^ - [last]

    AllowOverride None
    Options FollowSymLinks Multiviews 
    Require all granted
</Directory>