Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache .htaccess对于SPA,将传入请求重写为index.html,静态资源除外_Apache_.htaccess_Mod Rewrite_Server_Configuration - Fatal编程技术网

Apache .htaccess对于SPA,将传入请求重写为index.html,静态资源除外

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

编辑1非常感谢您的响应能力和耐心

我正在开发SPA路由器,所以一切都在index.html中进行。它使用HTML5历史API重写历史,创建SEO友好的URL将非常棒

有些部分已经在index.html上,而其他部分则使用ajax或fetch动态加载(如果需要的话)

该应用程序具有下一个基本目录结构

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中删除稍后执行路由所需的必要信息。例如,给定URL
example.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]