Bir ASM ağ geçidi veya sidecar proxy bir isteği engellediğinde ve bu isteği upstream hizmete iletmeden doğrudan bir HTTP yanıtı döndürdüğünde, varsayılan yanıt gövdesi not found veya RBAC: Access Denied gibi genel bir mesaj olur. CustomLocalReply plug-in, bu varsayılan yanıtları özel durum kodları, başlıklar ve gövde içeriğiyle değiştirir. Böylece eski URL'leri yönlendirebilir, markalı hata sayfaları sunabilir veya mesh içindeki API hata formatlarını standartlaştırabilirsiniz.
Senaryolar
| Amacınız... | Bkz. |
|---|---|
| Eski URL'leri yeni bir konuma yönlendirmek | 404 hatasını başka bir URL'ye yönlendirme |
| Düz metin yerine markalı bir HTML hata sayfası döndürmek | Özel 403 sayfası döndürme |
| API hata yanıtlarını JSON formatında standartlaştırmak | JSON hata yanıtı döndürme |
Yerel yanıtların oluşturulma durumu
ASM, aşağıdaki durumlarda upstream hizmeti atlayarak yerel bir yanıt oluşturur:
| Tetikleyici | Varsayılan durum kodu | Varsayılan gövde |
|---|---|---|
| İstekle eşleşen bir yönlendirme kuralı bulunmuyor | 404 |
not found |
| Bir yetkilendirme ilkesi isteği reddediyor | 403 |
RBAC: Access Denied |
Sanal hizmette bir directResponse yapılandırılmış |
Kullanıcı tanımlı | Kullanıcı tanımlı |
CustomLocalReply plug-in, bu yanıtlar downstream hizmete ulaşmadan önce onları yakalar ve sizin belirlediğiniz geçersiz kılmaları uygular.
Ön koşullar
Başlamadan önce aşağıdakileri yaptığınızdan emin olun:
Bir giriş ağ geçidi dağıtıldı. Daha fazla bilgi için bkz. Giriş ağ geçidi oluşturma.
Veri düzlemi kümesinde HTTPBin hizmeti çalışıyor. Bkz. HTTPBin uygulamasını dağıtma
Yapılandırma referansı
Üst düzey alanlar
| Alan | Tür | Gerekli | Geçerli değerler | Açıklama |
|---|---|---|---|---|
patch_context |
String | Evet | GATEWAY, SIDECAR_INBOUND |
Çalıştırma bağlamı. Bir ASM ağ geçidi için GATEWAY veya bir sidecar proxy için SIDECAR_INBOUND olarak ayarlayın. |
custom_error_pages |
CustomErrorPage[] | Evet | -- | Hata sayfası geçersiz kılma listesi. Her giriş, yerel olarak oluşturulan bir durum kodunu özel bir yanıtla eşleştirir. |
CustomErrorPage alanları
| Alan | Tür | Gerekli | Varsayılan | Açıklama |
|---|---|---|---|---|
match_status_code |
Integer | Evet | -- | Yakalanacak yerel olarak oluşturulan durum kodu. Ağ geçidi veya sidecar bu kodu oluşturduğunda aşağıdaki geçersiz kılma uygulanır. |
return_status_code |
Integer | Evet | -- | Eşleşen kod yerine downstream hizmete döndürülen durum kodu. |
content_type |
String | Evet | -- | content-type yanıt başlığı değeri (örneğin, text/html; charset=UTF-8 veya application/json). |
headers |
Map[string]string | Hayır | null | Özel yanıtta dahil edilecek ek yanıt başlıkları. |
body |
String | Evet | -- | Downstream hizmete döndürülen yanıt gövdesi. |
404 hatasını başka bir URL'ye yönlendirme
Bu örnek, bir directResponse kuralı tarafından oluşturulan 404 yanıtını yakalar ve bunu bir 301 yönlendirmesine dönüştürür.
Adım 1: Doğrudan yanıt içeren bir VirtualService dağıtma
Aşağıdaki VirtualService'i ASM örneğinize uygulayın. Bu yapılandırma, tüm istekler için not found gövdesiyle birlikte 404 durum kodu döndürecek şekilde ağ geçidini yapılandırır.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
namespace: default
spec:
gateways:
- httpbin-gateway
hosts:
- '*'
http:
- directResponse:
body:
string: not found
status: 404
Adım 2: CustomLocalReply plug-in'ini etkinleştirme
Aşağıdaki plug-in yapılandırmasını ingressgateway adlı ASM giriş ağ geçidine uygulayın. Bu yapılandırma 404 durum kodunu eşleştirir ve onu https://www.aliyun.com adresine yapılan bir 301 yönlendirmesiyle değiştirir.
patch_context: GATEWAY
custom_error_pages:
- match_status_code: 404
return_status_code: 301
headers:
location: 'https://www.aliyun.com'
content_type: text/html; charset=UTF-8
body: moved
Yönlendirmeyi doğrulama
Bir tarayıcı açın ve ASM ağ geçidi IP adresine gidin. Tarayıcı https://www.aliyun.com adresine yönlendirilir; bu da plug-in yapılandırmasının etkin olduğunu gösterir.
Özel 403 sayfası döndürme
Bu örnek, bir yetkilendirme ilkesi isteği reddettiğinde varsayılan RBAC: Access Denied mesajını markalı bir HTML hata sayfasıyla değiştirir.
Aşağıdaki plug-in yapılandırmasını ingressgateway adlı ASM giriş ağ geçidine uygulayın:
patch_context: GATEWAY
custom_error_pages:
- match_status_code: 403
return_status_code: 403
content_type: text/html; charset=UTF-8
body: |
<!DOCTYPE html>
<html>
<head><title>Access Denied</title></head>
<body>
<h1>403 - Access Denied</h1>
<p>You do not have permission to access this resource.
Contact your administrator if you believe this is an error.</p>
</body>
</html>
Bir yetkilendirme ilkesi isteği reddettiğinde, ağ geçidi düz metin RBAC: Access Denied mesajı yerine bu HTML sayfasını döndürür.
JSON hata yanıtı döndürme
Bu örnek, 404 yanıtları için yapılandırılmış bir JSON hata gövdesi döndürür. Bu yaklaşım, tutarlı bir hata formatı gerektiren API hizmetleri için kullanışlıdır.
Aşağıdaki plug-in yapılandırmasını ingressgateway adlı ASM giriş ağ geçidine uygulayın:
patch_context: GATEWAY
custom_error_pages:
- match_status_code: 404
return_status_code: 404
content_type: application/json
body: |
{
"error": {
"code": 404,
"message": "The requested resource was not found.",
"status": "NOT_FOUND"
}
}
Ağ geçidi bir 404 yanıtı oluşturduğunda, downstream hizmet düz metin not found mesajı yerine standartlaştırılmış bir hata yapısına sahip JSON gövdesi alır.
Tek bir yapılandırmada birden çok geçersiz kılma
Tek bir plug-in yapılandırmasında farklı durum kodlarını işlemek için custom_error_pages içinde birden çok giriş tanımlayın. Aşağıdaki örnek hem 404 hem de 403 yanıtlarını geçersiz kılar:
patch_context: GATEWAY
custom_error_pages:
- match_status_code: 404
return_status_code: 404
content_type: application/json
body: |
{
"error": {
"code": 404,
"message": "The requested resource was not found.",
"status": "NOT_FOUND"
}
}
- match_status_code: 403
return_status_code: 403
content_type: application/json
body: |
{
"error": {
"code": 403,
"message": "Access denied by authorization policy.",
"status": "FORBIDDEN"
}
}