我有一个混合使用 ReactJS SPA(动态)路由的 Apache 网站和静态 HTML 文件。常见的重写策略是将所有对不存在文件的请求导向到/index.html
站点的根目录。
我需要的是类似的,但是当请求进入目录时,它需要首先在每个目录中搜索一个(默认)index.html
文件。
因此,如果有以下请求:
www.example.com/this/directory/
它会首先寻找:
www.example.com/this/directory/index.html
...前重定向到www.example.com/index.html
React 应用程序所在的位置。
我目前的部分解决方案是:
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
根目录中(因为这将优先)。