Сделать ссылки в ответе относительно нового пути - PullRequest
2 голосов
/ 17 апреля 2019

Как мне перенаправить все мои hrefs в моем ответе, чтобы попасть на мой новый путь.Например, мой входной файл имеет вид

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-odin
  annotations:    
    nginx.ingress.kubernetes.io/rewrite-target: /$1

spec:
  rules:
  - http:
      paths:
      - path: /odin/?(.*)
        backend:
          serviceName: flask-app-tutorial
          servicePort: 8080

Когда я захожу на страницу по адресу https://mysite/odin., он работает и возвращает ответ:

Ответ HTML:

<html>
..
    <body>
        <div>
            <a href="/v0/index">Home</a>
            <a href="/v0/login">Login</a>
        </div>

    </body>
</html>

Однако, как видите, относительные ссылки похожи на <a href="/v0/index">Home</a>.Если я нажму на это, он не будет работать, так как нет такой ссылки, как http://mysite/v0/index.Если я нажму на ссылку, я хочу, чтобы она перешла на http://mysite/odin/v0/index.Возможно ли либо путем изменения ссылок в ответе иметь odin, либо, если я нажму на него, он будет смотреть на исходный URL, т.е. http://mysite/odin и направлять его относительно этого?

Nginx Version: 1.15.10
ingress-nginx: 0.24.0

До сих пор я пробовал следующее.

nginx.ingress.kubernetes.io/configuration-snippet: |
  proxy_set_header Accept-Encoding ""; #disable compression
  sub_filter '<head>' '<head> <base href="/odin/">';


nginx.ingress.kubernetes.io/add-base-url: ":true"
nginx.ingress.kubernetes.io/app-root: /odin

nginx.ingress.kubernetes.io/use-regex: "true"

Я также пробовал this т.е.

 change the spec.rules.host.paths.path from /odin/?(.*) to/(odin/.*)

В приведенном выше совете может быть опечатка.Я думаю, что это должно http вместо host.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

У меня была похожая проблема, и, вдохновившись вашим вопросом, я нашел решение, которое помогло мне. Ваша аннотация должна работать так:

nginx.ingress.kubernetes.io/configuration-snippet: |
  sub_filter_once on;
  sub_filter '<base href="/"' '<base href="/odin/"';

Как вы видите, sub_filter теперь включен, и я использовал base вместо head .

1 голос
/ 07 мая 2019

Даже если вы исправите фрагмент конфигурации sub_filter, включив sub_filter_once on;, как предложено в другом ответе, он не будет работать, поскольку тег base работает только с относительными путями (см .: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base).

Решение app-root является технически правильным, но сводится к тому же, что и <base href=... />, и, следовательно, также потерпит неудачу для href тегов с косой чертой.

Я вижу две возможности:

1) Вы можете исправить все свои теги href, удалив начальные косые черты. Если вы сделаете это, оба решения должны работать.

2) Вы можете попытаться изменить правило местоположения на - path: /(odin)?/?(.*) и аннотацию перезаписи на: nginx.ingress.kubernetes.io/rewrite-target: /$2 (не забывая также включить аннотацию nginx.ingress.kubernetes.io/use-regex: "true"), и она будет работать и с ведущей косой чертой.

Это выглядит хрупким, так как правило теперь будет соответствовать (почти) чему угодно, и вы теряете возможность использовать NGINX с разными префиксами пути.

Модификация "2)", чтобы сделать его более жизнеспособной альтернативой, состояла бы в том, чтобы соответствовать префиксу /v0, если он согласован среди тегов href, а не в основном чему-либо.

...