ローカル開発サーバーで素晴らしいアプリを実行していますが、本番環境対応ファイルを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://...com/main
3)。このURL( http://...com/main )をリロードすると、
The requested URL /main was not found on this server
Reactでのぼうぼう:
<Router history={browserHistory }>
<Route path="/" component={TopContainer}>
<IndexRoute component={Login} />
<Route path='main' component={MainContainer} />
</Route>
</Router>
Apache構成で他に何が欠けていますか?
ありがとう
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
。
Apacheリファレンス: Apache仮想ホストの構成
react-router
履歴参照: サーバーの構成
ここから完全に盗まれた完全な回答
上記の解決策はbuntでも機能しますが、少し苦労したので、これを機能させるために必要な手順を次に示します。
上記の構成を配置する必要があるファイルの場所は、
/etc/Apache2/sites-enabled
デフォルトは
/etc/Apache2/sites-enabled/000-default.conf
次に、RewriteEngineが実行されていることを確認する必要があります(そうしないと、Apacheサーバーを再起動するとエラーが発生します)。
Sudo a2enmod rewrite
最後に、Apacheサーバーを再起動します
Sudo /etc/init.d/Apache2 restart
今、それはうまくいくはずです。
デフォルトの構成を使用している場合(Webサイトのルートは/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 ...>
の下のファイルに
このリンクのようです( https://gkedge.gitbooks.io/react-router-in-the-real/content/Apache.html )は、必要なものだけです...
この設定は、SPAに役立ちます。
これは、存在するファイルを提供するようにApacheに指示しますが、それらが存在しない場合は、404ではなく/index.htmlを提供するだけです:見つかりません
あなたの問題が解決することを願っています!
.htaccessとサブディレクトリを使用する必要がある場合は、次のようにしてください。
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]
これまでに投稿された解決策はどれも、欠落しているリソースが404ではなく誤って200を返すという問題に対処しているように見えません。
私の解決策は、ブラウザがページに移動するときにHTMLを要求する(Firefoxは_text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
_を要求する)が、最初のロード(JSファイルがインポートされた) _<script>
_を介して、またはES6モジュールが_*/*
_を要求すると、CSSファイルは_text/css,*/*;q=0.1
_を要求し、fetch()
APIを介してJSONにアクセスすると_application/json, text/plain, */*
_が指定されます。 )。その仮定に依存することにより、存在しないファイル(シングルページアプリ内でのみ機能するルートなど)にアクセスしようとするときに、SPAが名前が変更されたCSSファイル、またはJSONファイルがありません。
EDIT:MDNには一般的な値のリストがあります Acceptヘッダー。
_<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>
_
私にとってうまくいったことは、ここで答えとコメントの多くを反映しています:
Sudo a2enmod rewrite
/etc/Apache2/Apache2.conf
<Directory "/var/www/<PATH_TO_YOUR_ROOT>">
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>
Sudo service Apache2 restart
以前の回答が示唆したように、サイト固有のconfファイルへの貼り付けは機能しませんでした。
このディレクトリに行きます
/ etc/Apache2/sites-available
ファイルを開く:000-default.conf
その許可を変更する:777
ファイルの下部にコードを貼り付けます
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]