У меня есть сайт Apache со смесью ReactJS SPA (динамической) маршрутизации и статические файлы 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, на данный момент нельзя.
Я огляделась, но не могу найти ответа на этот вопрос среди шума моих поисков.
Попробуйте что-нибудь вроде следующего:
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
в корне (поскольку это будет иметь приоритет).
Вы можете использовать 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]