Назад | Перейти на главную страницу

Для SPA перезаписывайте запросы в корневой index.html только после проверки index.html в подкаталоге

У меня есть сайт 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]