Apache .htaccess对于SPA,将传入请求重写为index.html,静态资源除外
编辑1非常感谢您的响应能力和耐心 我正在开发SPA路由器,所以一切都在index.html中进行。它使用HTML5历史API重写历史,创建SEO友好的URL将非常棒 有些部分已经在index.html上,而其他部分则使用ajax或fetch动态加载(如果需要的话) 该应用程序具有下一个基本目录结构Apache .htaccess对于SPA,将传入请求重写为index.html,静态资源除外,apache,.htaccess,mod-rewrite,server,configuration,Apache,.htaccess,Mod Rewrite,Server,Configuration,编辑1非常感谢您的响应能力和耐心 我正在开发SPA路由器,所以一切都在index.html中进行。它使用HTML5历史API重写历史,创建SEO友好的URL将非常棒 有些部分已经在index.html上,而其他部分则使用ajax或fetch动态加载(如果需要的话) 该应用程序具有下一个基本目录结构 assets/ css/ img/ js/ modules/ partials/ vendor/ index.html 现在在路由器中主要有节和子节,我将节重写为子目录,子节重写为子目录 exam
assets/
css/
img/
js/
modules/
partials/
vendor/
index.html
现在在路由器中主要有节和子节,我将节重写为子目录,子节重写为子目录
example.com/index.html <--- where the magic happens
但是如果用户重新加载网站,他会得到错误404
然后,当用户导航到该部分的一个子部分时,他将在url栏中看到
example.com/customers/casestudy
但是,如果用户重新加载,他会得到错误404
我想要的是将这些URL永久地重新写入index.html,它的路由器/状态管理器将恢复(加载/显示)正确的状态
这样做的目的是,URL是SEO友好的,搜索引擎可以正确索引网站的每个部分。此外,如果我们需要将网站的URL交给客户/合作伙伴/利益相关者/任何人
example.com/mydata is better than example.com/index.html/#/dataFragment25654789
提前谢谢
编辑02
下一个.htaccess工作正常
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
除非尝试加载子节
example.com/customer/mydata
然后它得到未捕获的SyntaxError:Unexpected Token'example.com/
-example.com/mydirectory/
或example.com/mydirectory/anyfile.file
到/index.html
的URL应该是example.com/mydirectory
-example.com/mydirectory/mydirectory
或example.com/mydirectory/anyfile.file
到/index.html
URL应该是example.com/mydirectory/mydirectory
听起来(根据您更新的问题)您“仅仅”需要一个标准的前端控制器类型模式。。。将所有内容重写为/index.html
(在文档根目录中),对静态资源的请求除外
例如,在根.htaccess
文件中:
# Allow mod_dir to serve index.html when requesting the directory
DirectoryIndex index.html
RewriteEngine On
# Front-controller (exclude static resources)
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_URI} !^/(assets|css|img|js|modules|partials|vendor)/
RewriteRule . index.html [L]
index.html
然后必须查看请求的URL,以确定如何路由请求
请注意,对于涉及多个路径段(如/customers/casestudy
)的任何请求,您需要确保对静态资源(JS、CSS、图像等)使用根相对URL(以斜杠开头)或绝对URL(scheme+hostname)。任何相对URL自然都是相对于客户端URL的,并且很可能无法解析
上面的第一个重写规则
防止在初始重写后重新处理以下规则,以防止重写循环(和小优化)
根据REQUEST\u URI
服务器变量检查请求的URL的条件确保我们不会重写已知子目录中的任何资源。这是在重写之前检查文件系统上是否不存在文件(或目录)的一种更为理想的方法,因为文件系统检查相对昂贵。但是,在不一定具有简明定义的结构的系统上,可能需要进行文件系统检查
但是index.html
也很难看,最好将其重写为(实际上不需要,因为它是自然发生的,但拥有它很好)
是的,您不需要在URL中指定/index.html
,因为请求根目录时,mod_dir将发出index.html
的内部子请求(这是DirectoryIndex.html
指令所做的)
但是,如果用户直接请求/index.html
(或第三方/搜索引擎无意中链接到),则可以发出外部重定向。在内部,您应该链接到/
,而不是/index.html
——因为您不想重定向普通用户
例如,在重写引擎
指令之后(前控制器之前):
检查REDIRECT\u STATUS
环境变量的条件确保我们不会得到重定向循环(因为后面的规则将请求重写回index.html
)<代码>重定向_状态未在初始请求中设置,并且在第一次成功重写后设置为“200”
请注意,这当前是一个302(临时)重定向。只有在确认此功能正常后,才能将其更改为301(永久)。浏览器会永久缓存301s,因此可能会导致测试出现问题。对静态资源的请求是什么。。。图像、CSS、JS等是否也应重写为
index.html
?避免热链接可能会很好,文件可以重定向到名为hotlinking.html的文件,除了搜索引擎,上一个示例中的可恢复的example.com/mydirectory/anyfile.file
应为example.com/mydirectory/mydirectory/anyfile.file
。(?)不幸的是,你的建议是不可能的。当您请求example.com/mydirectory/any.file
(其中any.file
实际上是任何文件)时,不能使URL看起来像example.com/mydirectory
,因为您正在从URL中删除稍后执行路由所需的必要信息。例如,给定URLexample.com/mydirectory
,如何将其映射回example.com/mydirectory/any.file
或example.com/mydirectory/other.file
?(你不能-这是一对多的关系。)@mrWhite谢谢你的反应和耐心,我已经编辑了这个问题,我正在评估,什么是可能的,什么是不可能的,以适应应用程序。使用这个时,javascript无法初始化,“意外标记”似乎问题的标题也不是对问题的最佳描述,听起来你在使用relat
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
# Allow mod_dir to serve index.html when requesting the directory
DirectoryIndex index.html
RewriteEngine On
# Front-controller (exclude static resources)
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_URI} !^/(assets|css|img|js|modules|partials|vendor)/
RewriteRule . index.html [L]
# Redirect "/index.html" to "/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.html$ / [R=302,L]