.htaccess для SPA, переписать входящие запросы в индекс. html, за исключением ресурсов stati c - PullRequest
0 голосов
/ 22 января 2020

РЕДАКТИРОВАТЬ 1 Большое спасибо за отзывчивость и терпение!.

Я занимаюсь разработкой маршрутизатора SPA, поэтому все происходит в индексе. html. Он использует HTML5 History API, чтобы переписать историю, и было бы здорово создать SEO-дружественные URL-адреса.

Некоторые разделы уже включены в индекс. html, а другие загружаются динамически с помощью ajax или извлекаются (если это имеет значение)

Приложение имеет следующую структуру каталогов basi c

assets/ 
css/
img/
js/
modules/
partials/
vendor/
index.html

Теперь в роутере в основном есть разделы и подразделы, я переписываю разделы как подкаталог, а подразделы - как подкаталог

example.com/index.html <--- where the magic happens

Но индекс. html - это также, некрасиво, было бы предпочтительнее переписать его (не очень нужно, поскольку это происходит естественно, но приятно иметь)

example.com R=301 <permanent

Затем, когда пользователь перейдет к разделу, URL будет переписан историей api as:

example.com/customers

Но если пользователь перезагружает сайт, он получает ошибку 404

Затем, когда пользователь переходит к подразделу этого раздела, он увидит в строке URL-адреса

example.com/customers/casestudy

Но, опять же, если пользователь перезагружается, он получает ошибку 404

. Я хочу постоянно перезаписывать эти URL-адреса в индекс. html и его маршрутизатор / менеджер состояний будет восстановить (загрузить / показать) исправление t state.

Цель этого заключается в том, чтобы URL-адреса были оптимизированы для SEO и чтобы поисковые системы могли правильно индексировать каждый раздел сайта. Также, если нам нужно передать URL нашего сайта клиенту / партнеру / заинтересованному лицу / кому-либо

example.com/mydata is better than example.com/index.html/#/dataFragment25654789

Заранее спасибо

РЕДАКТИРОВАТЬ 02 Следующий .htaccess работает нормально


  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]

, за исключением случаев, когда пытается загрузить подраздел

example.com / customer / mydata

Затем он получает необработанное SyntaxError: Неожиданно Токен '<' совпадает с ответом @MrWhite </p>

СТАРЫЙ ВОПРОС

Я хочу навсегда переписать запрашивает любой файл или подкаталог моего index.html, поскольку он будет отправлять правильные представления, но с сохранением структуры подкаталога, файлы не допускаются. Я не могу заставить его работать, особенно с подкаталогами - example.com/index.html или anyother.file ---> example.com/ - example.com/mydirectory/ или example.com/mydirectory/anyfile.file до /index.html URL должен выглядеть example.com/mydirectory - example.com/mydirectory/mydirectory или example.com/mydirectory/anyfile.file до /index.html URL должен выглядеть example.com/mydirectory/mydirectory

1 Ответ

1 голос
/ 24 января 2020

Звучит (из вашего обновленного вопроса), что вам "просто" нужен стандартный шаблон типа front-controller ... переписать все в /index.html (в документе root), за исключением запросов к ресурсам c .

Например, в вашем файле root .htaccess:

# Allow mod_dir to serve index.html when requesting the directory
DirectoryIndex index.html

RewriteEngine On

# Front-controller (exclude static resources)
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_URI} !^/(assets|css|img|js|modules|partials|vendor)/
RewriteRule . index.html [L]

index.html затем необходимо посмотреть запрошенный URL-адрес, чтобы определить, как маршрутизировать запрос.

Обратите внимание, что для любых запросов, включающих несколько сегментов пути, например /customers/casestudy, вам необходимо убедиться, что вы используете root -относительные URL-адреса (начиная с sla sh) или абсолютные URL-адреса (схема + имя хоста) на ваши ресурсы c (JS, CSS, изображения и т. д. c.). Любые относительные URL-адреса, естественно, будут относиться к клиентскому URL-адресу и, скорее всего, не смогут быть разрешены.

Первый RewriteRule выше предотвращает повторную обработку следующего правила после первоначальной перезаписи, чтобы предотвратить перезапись l oop (и незначительную оптимизацию).

Условие, которое проверяет запрошенный URL по серверной переменной REQUEST_URI, гарантирует, что мы не перезаписываем какие-либо ресурсы в известных подкаталогах. Это более оптимальный способ проверки того, что файл (или каталог) не существует в файловой системе перед перезаписью, поскольку проверки файловой системы относительно дороги. Однако в системах, которые не обязательно имеют четко определенную структуру, тогда может потребоваться проверка файловой системы.

Но index.html также уродлив, было бы предпочтительнее переписать ее (не совсем необходимо, как это происходит, естественно, но приятно иметь)

Да, вам не нужно указывать /index.html в URL, так как mod_dir выдаст внутренний подзапрос для index.html при запросе * Каталог 1059 * (это то, что делает директива DirectoryIndex index.html).

Однако вы можете выполнить внешнее перенаправление, если /index.html запрашивается непосредственно пользователем (или случайно связан с третьими лицами / поисковыми системами) , Внутренне вы должны ссылаться на /, а не /index.html - так как вы не хотите перенаправлять обычных пользователей.

Например, сразу после директивы RewriteEngine (и до фронта -controller ):

# Redirect "/index.html" to "/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.html$ / [R=302,L]

Условие, которое проверяет переменную окружения REDIRECT_STATUS, гарантирует, что мы не получим перенаправление l oop (поскольку более позднее правило переписывает запрос обратно в index.html). REDIRECT_STATUS не устанавливается для первоначального запроса и устанавливается на «200» после первого успешного перезаписи.

Обратите внимание, что в настоящее время это 302 (временное) перенаправление. Измените его на 301 (постоянный) только после того, как подтвердите, что это работает нормально. 301s постоянно кэшируется браузером, поэтому тестирование может стать проблематичным

...