.htaccess 如果文件或文件夹不存在则打开主页,但保留 URL + URL 路由

.htaccess Open main page if file or folder doesn't exist, but keep URL + URL Routing

我看了很多类似的话题,但没有找到正确的答案,所以请帮助我。

假设用户在我的网页中键入一个不存在的子目录:

www.example.com/subpage-1

我想达到的目标:

我想打开我的主页(www.example.com - 实际上隐藏了 index.html),但保持 URL 不变,子页面不存在(www.example.com/subpage-1) .

我需要它的原因: 我的网站只有主站点 (index.html),所有内容都通过 JavaScript 动态控制。

我想引入子页面 - 但我只想使用我的主 index.html 站点和 JS 来控制它。 (就像单页应用程序一样。)

所以当用户输入 URL www.example.com/subpage-1, 我的主站点打开了,但是由于 URL 保持不变,JS 脚本可以检查 URL,看,是否请求了 subpage-1,并为其生成正确的内容(如果 subpage-1当然是支持的)。

这也可能是一个 SEO 友好的解决方案,因为我可以提供 Google 带有可用子页面的站点地图 - 但是所有内容都将通过相同的 index.html 和 JS 进行控制。

如何实现?

到目前为止我发现了什么:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.html?url= [QSA,L]

我的问题是它每次都打开主页,我在任何地方都找不到查询 (?url=),所以我无法使用它。


还有一个我不知道如何处理的问题: 假设用户输入 www.example.com/subpage-1 它工作正常,因为我的 JS 脚本处理“subpage-1”。

但是如果

www.example.com/non-existing-subpage 

进入了吗?使用上面的解决方案,它会再次打开主页,但 JS 无法为其加载任何内容。对于所有不存在的子页面,我仍然想要 404。 我怎样才能实现它?

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.html?url= [QSA,L]

My problem with this that however it opens the main page every time, I can't find the query (?url=) anywhere, so I can't use it.

这是服务器上的内部重写。因此,url URL 参数(仅在内部重写时出现)仅可用于 server-side 脚本,而不是 client-side JavaScript。 browser/client 只能看到来自服务器的响应 - 它不知道哪个文件产生了该响应。但是,client-side JavaScript 可以看到浏览器地址栏中的内容,可通过 window.location 对象访问。

因此,您可以改为简化 RewriteRule 指令:

RewriteRule . index.html [L]

并且在您的 JS 中,您可以从 window.location.pathname 属性 中读取请求的 URL-path。例如,如果您请求 example.com/foo,那么 pathname 属性 包含 /foo(带有斜杠前缀),以便您在脚本中进行相应操作。

I still want 404 for all of the non existing subpages. How can I achieve it?

如果您只使用 client-side JavaScript,则不能。 “404 Not Found”状态是从服务器发送的 HTTP 响应。

您在 client-side JS 中所能做的最好的事情就是向用户显示 looks-like 一条“404 Not Found”消息,并确保您有一个 robots 元标记防止索引。但这仍然以 200 OK HTTP 状态提供。搜索引擎(即 Google)可能会将其视为软 404(即看起来像 404,但状态为 200 OK 的页面)。

如果您想提供 404 HTTP 响应状态,那么 服务器 需要知道哪些是 valid/invalid URL。