Я пытаюсь обойти тот факт, что SPA (то есть страницы, обработанные javascript) не могут обслуживать метаданные Twitter, и эти метаданные должны быть частью HTML-страницы сервера. Есть много подходящих решений этой проблемы, таких как рендеринг на стороне сервера, но я ищу более быстрый способ, поскольку я хочу, чтобы это было для страницы, обслуживаемой всего тремя разными URL-адресами.
Я хочу достичь:
http: //example.com => обычно обслуживает index.html (в index.html жестко запрограммированы мета-теги заголовка)
http://example.com/accept обслуживает index.html, но с замененными метатегами за счет использования sub_filter, в котором есть слово accept
http://example.com/reject , обслуживает index.html, но с заменой метатегов за счет использования sub_filter со словом reject
I пробовал использовать разные места, например:
location / {
try_files $uri /index.html;
}
location /accept {
sub_filter 'normal' 'accept';
sub_filter_once off;
try_files $uri /index.html;
}
Но я получил index.html с обычными метатегами. Если я перемещаю sub_filter в место /, то замена строки работает.
Также экспериментировал с перезаписью, если внутри помещения и т. д., но не смог заставить его работать.
Последний элемент оператора try_files
ищет другое местоположение
для обработки запроса на /index.html
, который поэтому он не обрабатывается в том же блоке location
.
Вы можете использовать alias
директиву или rewrite ... break
to продолжать обработку в том же блоке местоположения.
location /accept {
default_type text/html;
alias /path/to/index.html;
sub_filter 'normal' 'accept';
sub_filter_once off;
}
Или:
location /accept {
rewrite ^ /index.html break;
sub_filter 'normal' 'accept';
sub_filter_once off;
}
Ричард Смит был прав, это последний элемент try_files
(откат), который вызывает проблему, поскольку откат обрабатывается в другом контексте. Так что самый простой ответ - сделать индекс .html
больше не последний элемент.
location /accept {
sub_filter 'normal' 'accept';
sub_filter_once off;
try_files $uri /index.html /index.html; # notice this with 2 index.html
}