Я пытаюсь изменить .htaccess
на самом деле перенаправить все на index.html
для запуска приложения Angular 11, но у меня есть несколько файлов .pdf
в подпапке /assets/files/*.pdf
, и я хочу разрешить доступ к этим файлам.
Папка assets
и index.html
находятся в корне
В моем приложении я делюсь файлами с href
:
Пример: pdfFileUrl = assets/files/myFile.pdf
<a class = "icon" [href] = "pdfFileUrl" download title = "Download my file">
Вот мой .htaccess
:
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^.*$ https://www.%1%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !^/assets/files/ // not work
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html [NC,L]
но файлы имеют формат html и не работают
Может быть, есть другой способ, я думаю, что с blob, но я этого не знаю.
Я делюсь файлами с помощью href: Пример: pdfFileUrl = assets/files/myFile.pdf
Вам нужно использовать относительный корневой (начинающийся с косой черты) URL-путь к вашему файлу PDF, а не относительный путь, как показано здесь. Если ваши URL-адреса не состоят только из отдельных сегментов пути, то, когда пользователь находится в /foo/bar
, относительный URL-адрес на стороне клиента в форме assets/files/myFile.pdf
естественным образом разрешается в /foo/assets/files/myFile.pdf
, который предположительно не существует, поэтому будет перенаправлен на ваш фронт-контроллер Angular (т.е. /index.html
).
Например:
href = "/assets/files/myFile.pdf"
RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} !^/assets/files/ // not work RewriteRule ^.*$ - [NC,L]
Я предполагаю по наличию "//не работает", что это строчка, которую вы добавили? Однако само наличие этой строки приведет к тому, что запрос на /assets/files/myFile.pdf
будет перенаправлен на фронт-контроллер Angular (последний RewriteRule
).
Вам нужно будет удалить префикс отрицания (!
) в CondPattern или просто полностью удалить директиву RewriteCond
, поскольку первое условие, которое проверяет -s
, уже проверяет, что запрос сопоставляется с файлом «размера». Или измените это для сравнения -f
, чтобы проверить файлы даже нулевого размера.
Регулярное выражение ^.*$
можно упростить до простого ^
, а флаг NC
лишний.
Ваш файл .htaccess
должен выглядеть примерно так:
RewriteEngine on
# Canonical redirect HTTP to HTTPS and non-www to www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
# Prevent static resources being rewritten to Angular
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# All other requests get routed to Angular
RewriteRule ^ /index.html [L]
И, что важно, как упоминалось выше, убедитесь, что вы ссылаетесь на корневой URL-путь в исходном HTML-коде.
Большое спасибо это работа! Я попробую с абсолютным путем и безрезультатно с моим .htaccess, поэтому большое спасибо за ваш ответ и ваше объяснение, мне нужно больше узнать об этом. И не забудьте добавить пользователю права на чтение файлов -rw----r-- !