使用 React 在 apache 上刷新页面不起作用

Refresh page on apache with React doesn't work

我正在尝试使用 React 创建 SPA,但在尝试重新加载页面时 运行 遇到了问题。

在我继续之前,我必须说我已经阅读了这些问题 and 。我设法使它起作用,但仅适用于第一个 url.

例如,我有一个包含所有 post 的博客页面,可通过此 url mysite.com/blog 访问。这个很好用,如果我刷新页面,一切都会重新加载。

但是,当我尝试使用动态 url 访问单个 post 时,页面无法正常工作。例如,我有这个路由器设置:

// Definiton
<Route path="/post/:url" component={Post} />

// Link
<NavLink to={"post/" + post.url}>...</NavLink>

// Url on the browser
mysite.com/post/this-is-my-first-post

在这种情况下,它不起作用。这是我的 .htaccess 文件:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteBase /
    RewriteRule ^index.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]
</IfModule>

仔细查看问题后,我注意到它正试图从不同的位置加载主要文件。例如,当我在页面 mysite.com/blog 上时,它正在从 mysite.com.

加载 .css.js 文件

但是当我进入页面 mysite.com/post/this-is-my-first-post 并刷新页面时,它会尝试从目录 mysite.com/blog 加载 .css.js 文件。

我按照回答中的 Stuffix 说明进行了操作,检查了 url 定义以及我的 apache 中的配置,但一切都已启用并正常工作,就像答案所说的那样。

在您的 <Route /> 中,您声明 post 路线是 /post/this-is-my-first-post,这是正确的。

但是在你的 <NavLink /> 中,你指向 /blog/post/this-is-my-first-post 因为你错过了一个斜杠。

<NavLink to={"post/" + post.url}>...</NavLink>
              | here

从而导致 404。


如果这没有帮助,您的代码片段看起来不错,那么问题可能在于 post.url returns.

此外,您的 .htaccess 看起来不错,所以我想说您可能在 Apache 配置中遗漏了某些内容,例如 AllowOverride all。参见 this answer

嗯,在查看了我使用的其他一些项目后 Angular,我注意到一件事,它比我想象的要容易。

只需在我的 index.htmlhead 上添加标签 base

<base href="/" />

这个 htaccess 对我有用 react 和 angular

<IfModule mod_rewrite.c>
RewriteEngine on

# -- REDIRECTION to https (optional):
# If you need this, uncomment the next two commands
# RewriteCond %{HTTPS} !on
# RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
# --

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) index.html [NC,L]
</IfModule>