私は自分のプロジェクトの1つをまとめましたが、うまくいきます。ただし、ルート/ aboutで更新を押すと、「要求されたURL/aboutはこのサーバーで見つかりませんでした。」と表示されます。クライアント側のルーティングにreact-routerを使用しています。
ここにクライアント側のルーティングがありますが、その問題は疑います
Router.run(routes, Router.HistoryLocation, function (Handler) {
React.render(<Handler/>, app);
});
そして私のルートはそこにあります:
let routes = (
<Route>
<Route name = "App" path="/" handler = {App}>
<Route name="About" path="/about" handler = {About}/>
<DefaultRoute name="Projects" handler = {Projects}/>
</Route>
</Route>
);
ここで私が破ったと思うApache:
<Directory /var/www/>
# This directive allows us to have Apache2's default start page
# in /Apache2-default/, but still have / go to the right place
Require all granted
#RedirectMatch ^/$ /Apache2-default/
</Directory>
kkotwal.me.conf:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual Host. For the default virtual Host (this file) this
# value is not decisive as it is used as a last resort Host regardless.
# However, you must set it for any further virtual Host explicitly.
#
ServerName kkotwal.me
ServerAlias www.kkotwal.me
ServerAdmin webmaster@localhost
DocumentRoot /var/www/kkotwal.me/public_html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${Apache_LOG_DIR}/error.log
CustomLog ${Apache_LOG_DIR}/access.log combined
</VirtualHost>
ちょっとこれは実際にはかなり一般的なことです。
何が起こっているかは、ネストされたパスを無視し、すべてのリクエストを送信するようにApacheサーバーを取得する必要があることです/*
代わりにルートに。これにより、フロントエンドのJavaScriptがクライアント側でルートを取得し、正しいビューを表示できます。
これは、異なるWebサーバーでは「HTML5モード」と呼ばれることもあります。
Apacheでこれを行うには、次のようなルールを追加します。
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
RewriteRule ^ /index.html [L]
これは、存在するファイルを提供するようにApacheに指示しますが、存在しない場合は、/index.html
ではなく、404が見つかりません。
Laravelの場合、すべてのルートが反応ファイルに書き込まれる同じビューをレンダリングする必要があります。 Laravelルートは次のように記述されます。
Route :: get( '{url}'、function(){return view( 'welcome');})-> where(['url' => '。*']);
ようこそブレードファイルは次のとおりです。
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<link href="{{asset('css/app.css')}}" rel="stylesheet" type="text/css">
</head>
<body>
<div id="root"></div>
<script src="{{asset('js/app.js')}}" ></script>
</body>
</html>
<Route>
<Route name = "App" path="/" handler = {App}>
<Route name="About" path="/about" handler = {About}/>
<DefaultRoute name="Projects" handler = {Projects}/>
</Route>
ルートについて更新するたびに、app.jsファイルにウェルカムブレードとそれぞれのルートが表示されます