对于 SPA,仅在检查子目录中的 index.html 后,将请求重写到根目录 index.html

对于 SPA,仅在检查子目录中的 index.html 后,将请求重写到根目录 index.html

我有一个混合使用 ReactJS SPA(动态)路由的 Apache 网站静态 HTML 文件。常见的重写策略是将所有对不存在文件的请求导向到/index.html站点的根目录。

我需要的是类似的,但是当请求进入目录时,它需要首先在每个目录中搜索一个(默认)index.html文件。

因此,如果有以下请求:

www.example.com/this/directory/

它会首先寻找:

www.example.com/this/directory/index.html

...重定向到www.example.com/index.htmlReact 应用程序所在的位置。

我目前的部分解决方案是:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]

...哪个重定向到根目录index.html,但是才不是index.html首先在子目录中查找文件。

网站的静态 HTML 部分非常庞大,因此此时重新修复所有 HREF 是不可行的。

我环顾四周,但在搜索的噪音中却找不到答案。

答案1

您可以分别使用RewriteCond条件-f-d检查现有文件和目录:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# Apache will stop here if a file or directory exists.
# Add whatever you need afterwards, for example:
RewriteRule . index.html [L]

答案2

尝试如下操作:

Options -MultiViews
RewriteEngine On

DirectoryIndex index.html

# Abort early if request is already for index.html in the root
RewriteRule ^index\.html$ - [L]

# Request a directory - check for index.html in that directory
# (Excludes the document root)
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule %{DOCUMENT_ROOT}/$1/index.html -f
RewriteRule ^(.+?)/?$ $1/index.html [L]

# Route all other non-file requests to index.html in the root
# (incl. directories that don't contain index.html themselves)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.html [L]

根据你最初的指示,这将路由所有目录根目录中不包含index.html文档。index.html

QSA这里不需要标志。


或者,您可以修改DirectoryIndex为首先检查当前目录,然后回退到/index.html根目录中的文件。

例如:

Options -MultiViews
RewriteEngine On

# index.html in current directory, followed by /index.html (in root)
DirectoryIndex index.html /index.html

# Abort early if request is already for index.html in the root
RewriteRule ^index\.html$ - [L]

# Route all non-file/directory to index.html in the root
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.html [L]

这需要在最后一个规则块上进行额外的目录检查,否则所有目录请求都将被重写到/index.html根目录中(因为这将优先)。

相关内容