Browse Source

feat: add directive auto complete and documents #816

Jacky 5 months ago
parent
commit
5911462f90

+ 18 - 0
api/nginx/directives.go

@@ -0,0 +1,18 @@
+package nginx
+
+import (
+	"net/http"
+
+	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/gin-gonic/gin"
+	"github.com/uozi-tech/cosy"
+)
+
+func GetDirectives(c *gin.Context) {
+	directives, err := nginx.GetDirectives()
+	if err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+	c.JSON(http.StatusOK, directives)
+}

+ 1 - 0
api/nginx/router.go

@@ -11,6 +11,7 @@ func InitRouter(r *gin.RouterGroup) {
 	r.POST("nginx/test", Test)
 	r.GET("nginx/status", Status)
 	r.POST("nginx_log", GetNginxLogPage)
+	r.GET("nginx/directives", GetDirectives)
 }
 
 func InitNginxLogRouter(r *gin.RouterGroup) {

+ 0 - 1
app/.idea/jsLinters/eslint.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="EslintConfiguration">
-    <custom-configuration-file used="false" path="$PROJECT_DIR$/.eslintrc.cjs" />
     <option name="fix-on-save" value="true" />
   </component>
 </project>

+ 6 - 0
app/src/api/ngx.ts

@@ -33,6 +33,8 @@ export interface NgxLocation {
   comments: string
 }
 
+export type DirectiveMap = Record<string, { links: string[] }>
+
 const ngx = {
   build_config(ngxConfig: NgxConfig) {
     return http.post('/ngx/build_config', ngxConfig)
@@ -61,6 +63,10 @@ const ngx = {
   test() {
     return http.post('/nginx/test')
   },
+
+  get_directives(): Promise<DirectiveMap> {
+    return http.get('/nginx/directives')
+  },
 }
 
 export default ngx

+ 1 - 1
app/src/language/LINGUAS

@@ -1 +1 @@
-en zh_CN zh_TW fr_FR es de_DE ru_RU vi_VN ko_KR tr_TR ar
+en zh_CN zh_TW fr_FR es de_DE ru_RU vi_VN ko_KR tr_TR ar

+ 39 - 27
app/src/language/ar/app.po

@@ -67,7 +67,7 @@ msgstr "أضف مفتاح مرور"
 msgid "Add Configuration"
 msgstr "إضافة تكوين"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "أضف التوجيه أدناه"
 
@@ -179,7 +179,7 @@ msgstr "هل أنت متأكد أنك تريد الحذف؟"
 msgid "Are you sure you want to recover this item?"
 msgstr "هل أنت متأكد أنك تريد استرداد هذا العنصر؟"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "هل أنت متأكد أنك تريد إزالة هذا التوجيه؟"
 
@@ -203,7 +203,7 @@ msgstr "المساعد"
 msgid "Attempts"
 msgstr "محاولات"
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr "مصادقة"
 
@@ -265,7 +265,7 @@ msgid "Base information"
 msgstr "المعلومات الأساسية"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -294,7 +294,7 @@ msgstr "ترقية متعددة"
 msgid "Belows are selected items that you want to batch modify"
 msgstr "فيما يلي العناصر المحددة التي تريد تعديلها دفعة واحدة"
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "بناء مع"
 
@@ -330,7 +330,7 @@ msgstr "إلغاء"
 msgid "Category"
 msgstr "فئة"
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 msgid "Cert"
 msgstr "شهادة"
 
@@ -408,7 +408,7 @@ msgstr "تم المسح بنجاح"
 msgid "Command"
 msgstr "أمر"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -443,7 +443,7 @@ msgstr "متصل"
 msgid "Connection lost, please refresh the page."
 msgstr "تم فقدان الاتصال، يرجى تحديث الصفحة."
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -605,15 +605,15 @@ msgstr "وصف"
 msgid "Details"
 msgstr "تفاصيل"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "وضع التطوير"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "توجيه"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "توجيهات"
 
@@ -725,6 +725,18 @@ msgstr "هل تريد إزالة هذا الخادم؟"
 msgid "Do you want to remove this upstream?"
 msgstr "هل تريد إزالة هذا المصدر؟"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "ملف API"
+msgstr[1] "ملف API"
+msgstr[2] "ملف API"
+msgstr[3] "ملف API"
+msgstr[4] "ملف API"
+msgstr[5] "ملف API"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr "نطاق"
@@ -1215,7 +1227,7 @@ msgstr "تركه فارغًا لن يغير شيئًا"
 msgid "Lego disable CNAME Support"
 msgstr "تعطيل دعم ‏Lego CNAME"
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 msgid "License"
 msgstr "رخصة"
 
@@ -1269,7 +1281,7 @@ msgstr "تم تسجيل الدخول بنجاح"
 msgid "Logout successful"
 msgstr "تم تسجيل الخروج بنجاح"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr "تدوير السجلات"
 
@@ -1358,7 +1370,7 @@ msgstr "تعديل التكوين"
 msgid "Modify Mode"
 msgstr "وضع التعديل"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 msgid "Multi-line Directive"
 msgstr "توجيه متعدد الأسطر"
 
@@ -1414,7 +1426,7 @@ msgstr "تم إصدار نسخة جديدة"
 msgid "Next"
 msgstr "التالي"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1481,7 +1493,7 @@ msgstr "تم إعادة تشغيل Nginx بنجاح"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1590,7 +1602,7 @@ msgstr "بمجرد اكتمال التحقق، سيتم إزالة السجلا
 msgid "Online"
 msgstr "متصل"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr "أوبن أي آي"
 
@@ -1620,7 +1632,7 @@ msgstr "الكتابة فوق"
 msgid "Overwrite exist file"
 msgstr "الكتابة فوق الملف الموجود"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "عوامل"
 
@@ -1759,7 +1771,7 @@ msgstr "يرجى ترقية واجهة Nginx البعيدة إلى أحدث إص
 msgid "Pre-release"
 msgstr "ما قبل الإصدار"
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "تفضيل"
 
@@ -1775,7 +1787,7 @@ msgstr "حظر تغيير كلمة مرور root في العرض التوضيح
 msgid "Prohibit deleting the default user"
 msgstr "حظر حذف المستخدم الافتراضي"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "فريق المشروع"
 
@@ -2026,15 +2038,15 @@ msgstr "يعمل"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "حفظ"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "حفظ التوجيه"
 
@@ -2063,7 +2075,7 @@ msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 msgid "Save successfully"
 msgstr "تم الحفظ بنجاح"
 
@@ -2113,7 +2125,7 @@ msgstr "إرسال"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2160,7 +2172,7 @@ msgstr "عرض"
 msgid "Sign in with a passkey"
 msgstr "تسجيل الدخول باستخدام مفتاح المرور"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "توجيه واحد"
 
@@ -2716,7 +2728,7 @@ msgstr "كتابة الشهادة إلى القرص"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "نعم"

+ 35 - 27
app/src/language/en/app.po

@@ -65,7 +65,7 @@ msgstr ""
 msgid "Add Configuration"
 msgstr "Edit Configuration"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "Add Directive Below"
 
@@ -187,7 +187,7 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
 
@@ -213,7 +213,7 @@ msgstr ""
 msgid "Attempts"
 msgstr ""
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr ""
 
@@ -276,7 +276,7 @@ msgid "Base information"
 msgstr "Base information"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 #, fuzzy
@@ -307,7 +307,7 @@ msgstr ""
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "Build with"
 
@@ -343,7 +343,7 @@ msgstr "Cancel"
 msgid "Category"
 msgstr ""
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 msgid "Cert"
 msgstr ""
 
@@ -422,7 +422,7 @@ msgstr "Disabled successfully"
 msgid "Command"
 msgstr "Comments"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -458,7 +458,7 @@ msgstr ""
 msgid "Connection lost, please refresh the page."
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -628,15 +628,15 @@ msgstr ""
 msgid "Details"
 msgstr ""
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "Development Mode"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "Directive"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "Directives"
 
@@ -758,6 +758,14 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Do you want to remove this upstream?"
 msgstr "Are you sure you want to remove this directive?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "Comments"
+msgstr[1] "Comments"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr ""
@@ -1272,7 +1280,7 @@ msgstr "Leave blank for no change"
 msgid "Lego disable CNAME Support"
 msgstr ""
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 #, fuzzy
 msgid "License"
 msgstr "License"
@@ -1331,7 +1339,7 @@ msgstr "Login successful"
 msgid "Logout successful"
 msgstr "Logout successful"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr ""
 
@@ -1421,7 +1429,7 @@ msgstr "Modify Config"
 msgid "Modify Mode"
 msgstr "Modify Config"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 #, fuzzy
 msgid "Multi-line Directive"
 msgstr "Single Directive"
@@ -1480,7 +1488,7 @@ msgstr ""
 msgid "Next"
 msgstr "Next"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr ""
 
@@ -1551,7 +1559,7 @@ msgstr "Saved successfully"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1660,7 +1668,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr ""
 
@@ -1691,7 +1699,7 @@ msgstr ""
 msgid "Overwrite exist file"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "Params"
 
@@ -1827,7 +1835,7 @@ msgstr "Saved successfully"
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr ""
 
@@ -1844,7 +1852,7 @@ msgstr ""
 msgid "Prohibit deleting the default user"
 msgstr ""
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "Project Team"
 
@@ -2116,15 +2124,15 @@ msgstr ""
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "Save"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "Save Directive"
 
@@ -2157,7 +2165,7 @@ msgstr "Saved successfully"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 #, fuzzy
 msgid "Save successfully"
 msgstr "Saved successfully"
@@ -2208,7 +2216,7 @@ msgstr "Send"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2253,7 +2261,7 @@ msgstr ""
 msgid "Sign in with a passkey"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "Single Directive"
 
@@ -2799,7 +2807,7 @@ msgstr ""
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "Yes"

+ 35 - 27
app/src/language/es/app.po

@@ -70,7 +70,7 @@ msgstr "Agregar una llave de acceso"
 msgid "Add Configuration"
 msgstr "Agregar configuración"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "Añadir directiva a continuación"
 
@@ -184,7 +184,7 @@ msgstr "¿Está seguro de que quiere borrar?"
 msgid "Are you sure you want to recover this item?"
 msgstr "¿Está seguro de que quiere recuperar este elemento?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "¿Está seguro de que quiere borrar esta directiva?"
 
@@ -208,7 +208,7 @@ msgstr "Asistente"
 msgid "Attempts"
 msgstr "Intentos"
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr "Autenticación"
 
@@ -270,7 +270,7 @@ msgid "Base information"
 msgstr "Información general"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -301,7 +301,7 @@ msgstr ""
 "A continuación se muestran los elementos seleccionados que desea modificar "
 "por lotes"
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "Desarrollado con"
 
@@ -337,7 +337,7 @@ msgstr "Cancelar"
 msgid "Category"
 msgstr "Categoría"
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 msgid "Cert"
 msgstr "Certificado"
 
@@ -407,7 +407,7 @@ msgstr "Limpiado exitoso"
 msgid "Command"
 msgstr "Comando"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -442,7 +442,7 @@ msgstr "Conectado"
 msgid "Connection lost, please refresh the page."
 msgstr "Conexión perdida, por favor actualice la página."
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -606,15 +606,15 @@ msgstr "Descripción"
 msgid "Details"
 msgstr "Detalles"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "Modo de desarrollo"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "Directiva"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "Directivas"
 
@@ -723,6 +723,14 @@ msgstr "¿Quieres eliminar este servidor?"
 msgid "Do you want to remove this upstream?"
 msgstr "¿Quieres eliminar esta transmisión?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "Documento de la API"
+msgstr[1] "Documento de la API"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr "Dominio"
@@ -1228,7 +1236,7 @@ msgstr "Dejarlo en blanco no cambiará nada"
 msgid "Lego disable CNAME Support"
 msgstr "Lego deshabilita el soporte de CNAME"
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 msgid "License"
 msgstr "Licencia"
 
@@ -1282,7 +1290,7 @@ msgstr "Acceso exitoso"
 msgid "Logout successful"
 msgstr "Cierre de sesión exitoso"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr "Rotación de logs"
 
@@ -1372,7 +1380,7 @@ msgstr "Modificar configuración"
 msgid "Modify Mode"
 msgstr "Modo Modificar"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 msgid "Multi-line Directive"
 msgstr "Directiva multilínea"
 
@@ -1428,7 +1436,7 @@ msgstr "Se liberó una nueva versión"
 msgid "Next"
 msgstr "Siguiente"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1498,7 +1506,7 @@ msgstr "Nginx reiniciado con éxito"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1609,7 +1617,7 @@ msgstr "Una vez que se complete la verificación, los registros se eliminarán."
 msgid "Online"
 msgstr "En línea"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1639,7 +1647,7 @@ msgstr "Sobrescribir"
 msgid "Overwrite exist file"
 msgstr "Sobrescribir archivo existente"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "Parámetros"
 
@@ -1794,7 +1802,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr "Prelanzamiento"
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "Configuración"
 
@@ -1810,7 +1818,7 @@ msgstr "Prohibir cambiar la contraseña de root en la demostración"
 msgid "Prohibit deleting the default user"
 msgstr "Prohibir la eliminación del usuario predeterminado"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "Grupo del proyecto"
 
@@ -2070,15 +2078,15 @@ msgstr "Corriendo"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "Guardar"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "Guardar Directiva"
 
@@ -2113,7 +2121,7 @@ msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 msgid "Save successfully"
 msgstr "Guardado con éxito"
 
@@ -2165,7 +2173,7 @@ msgstr "Enviado"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2212,7 +2220,7 @@ msgstr "Mostrar"
 msgid "Sign in with a passkey"
 msgstr "Iniciar sesión con una llave de acceso"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "Directiva de una sola línea"
 
@@ -2791,7 +2799,7 @@ msgstr "Escribir certificado a disco"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "Si"

+ 35 - 27
app/src/language/fr_FR/app.po

@@ -67,7 +67,7 @@ msgstr ""
 msgid "Add Configuration"
 msgstr "Modifier la configuration"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "Ajouter une directive"
 
@@ -190,7 +190,7 @@ msgstr "Etes-vous sûr que vous voulez supprimer ?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Voulez-vous vraiment supprimer cette directive ?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "Voulez-vous vraiment supprimer cette directive ?"
 
@@ -216,7 +216,7 @@ msgstr ""
 msgid "Attempts"
 msgstr ""
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 #, fuzzy
 msgid "Auth"
 msgstr "Autheur"
@@ -279,7 +279,7 @@ msgid "Base information"
 msgstr "Information générale"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -310,7 +310,7 @@ msgstr "Mettre à niveau"
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "Build avec"
 
@@ -346,7 +346,7 @@ msgstr "Annuler"
 msgid "Category"
 msgstr ""
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 #, fuzzy
 msgid "Cert"
 msgstr "Auto Cert"
@@ -425,7 +425,7 @@ msgstr "Désactivé avec succès"
 msgid "Command"
 msgstr "Commentaires"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -460,7 +460,7 @@ msgstr ""
 msgid "Connection lost, please refresh the page."
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -631,15 +631,15 @@ msgstr "Description"
 msgid "Details"
 msgstr ""
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "Mode développement"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "Directive"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "Directives"
 
@@ -757,6 +757,14 @@ msgstr "Voulez-vous supprimer ce serveur ?"
 msgid "Do you want to remove this upstream?"
 msgstr "Voulez-vous supprimer ce serveur ?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "Jeton d'API"
+msgstr[1] "Jeton d'API"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr ""
@@ -1274,7 +1282,7 @@ msgstr "Laisser vide pour aucun changement"
 msgid "Lego disable CNAME Support"
 msgstr ""
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 #, fuzzy
 msgid "License"
 msgstr "Licence"
@@ -1335,7 +1343,7 @@ msgstr "Connexion réussie"
 msgid "Logout successful"
 msgstr "Déconnexion réussie"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr ""
 
@@ -1424,7 +1432,7 @@ msgstr "Modifier la configuration"
 msgid "Modify Mode"
 msgstr "Modifier"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 msgid "Multi-line Directive"
 msgstr "Directive multiligne"
 
@@ -1482,7 +1490,7 @@ msgstr "Nouvelle version publiée"
 msgid "Next"
 msgstr "Suivant"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 #, fuzzy
 msgid "Nginx"
 msgstr "Journal Nginx"
@@ -1553,7 +1561,7 @@ msgstr "Nginx a redémarré avec succès"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1662,7 +1670,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1692,7 +1700,7 @@ msgstr ""
 msgid "Overwrite exist file"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "Paramètres"
 
@@ -1838,7 +1846,7 @@ msgstr "Dupliqué avec succès"
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "Préférence"
 
@@ -1855,7 +1863,7 @@ msgstr "Interdire la modification du mot de passe root dans la démo"
 msgid "Prohibit deleting the default user"
 msgstr "Interdire la suppression de l'utilisateur par défaut"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "Groupe de projet"
 
@@ -2132,15 +2140,15 @@ msgstr "En cours d'éxécution"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "Enregistrer"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "Enregistrer la directive"
 
@@ -2173,7 +2181,7 @@ msgstr "Dupliqué avec succès"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 msgid "Save successfully"
 msgstr "Sauvegarde réussie"
 
@@ -2223,7 +2231,7 @@ msgstr "Envoyer"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2270,7 +2278,7 @@ msgstr ""
 msgid "Sign in with a passkey"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "Directive unique"
 
@@ -2823,7 +2831,7 @@ msgstr "Écriture du certificat sur le disque"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "Oui"

+ 35 - 27
app/src/language/ko_KR/app.po

@@ -68,7 +68,7 @@ msgstr ""
 msgid "Add Configuration"
 msgstr "구성 추가"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "아래에 지시문 추가"
 
@@ -181,7 +181,7 @@ msgstr "정말 삭제하시겠습니까?"
 msgid "Are you sure you want to recover this item?"
 msgstr "이 항목을 복구하시겠습니까?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "이 지시문을 정말로 제거하시겠습니까?"
 
@@ -205,7 +205,7 @@ msgstr "조수"
 msgid "Attempts"
 msgstr "시도 횟수"
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr "인증"
 
@@ -267,7 +267,7 @@ msgid "Base information"
 msgstr "기본 정보"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -296,7 +296,7 @@ msgstr "배치 업그레이드"
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "빌드 환경"
 
@@ -332,7 +332,7 @@ msgstr "취소"
 msgid "Category"
 msgstr ""
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 #, fuzzy
 msgid "Cert"
 msgstr "자동 인증"
@@ -405,7 +405,7 @@ msgstr "성공적으로 제거됨"
 msgid "Command"
 msgstr "명령어"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -440,7 +440,7 @@ msgstr "연결됨"
 msgid "Connection lost, please refresh the page."
 msgstr "연결이 끊어졌습니다. 페이지를 새로 고침하세요."
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -607,15 +607,15 @@ msgstr "설명"
 msgid "Details"
 msgstr "세부 사항"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "개발 모드"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "지시문"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "지시문들"
 
@@ -727,6 +727,14 @@ msgstr "이 서버를 제거하시겠습니까?"
 msgid "Do you want to remove this upstream?"
 msgstr "이 업스트림을 제거하시겠습니까?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "API 문서"
+msgstr[1] "API 문서"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr "도메인"
@@ -1237,7 +1245,7 @@ msgstr "변경사항이 없으면 비워두세요"
 msgid "Lego disable CNAME Support"
 msgstr ""
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 #, fuzzy
 msgid "License"
 msgstr "라이센스"
@@ -1296,7 +1304,7 @@ msgstr "로그인 성공"
 msgid "Logout successful"
 msgstr "로그아웃 성공"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr "로그관리"
 
@@ -1391,7 +1399,7 @@ msgstr "설정 수정"
 msgid "Modify Mode"
 msgstr "설정 수정"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 #, fuzzy
 msgid "Multi-line Directive"
 msgstr "단일 지시문"
@@ -1450,7 +1458,7 @@ msgstr "새 버전 출시"
 msgid "Next"
 msgstr "다음"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1523,7 +1531,7 @@ msgstr "Nginx가 성공적으로 재시작됨"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1632,7 +1640,7 @@ msgstr "검증이 완료되면, 레코드는 제거됩니다."
 msgid "Online"
 msgstr "온라인"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr "오픈AI"
 
@@ -1663,7 +1671,7 @@ msgstr "덮어쓰기"
 msgid "Overwrite exist file"
 msgstr "기존 파일 덮어쓰기"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "파라미터"
 
@@ -1803,7 +1811,7 @@ msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgid "Pre-release"
 msgstr "사전 출시"
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "환경설정"
 
@@ -1820,7 +1828,7 @@ msgstr "데모에서 루트 비밀번호 변경 금지"
 msgid "Prohibit deleting the default user"
 msgstr "기본 사용자 삭제 금지"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "프로젝트 팀"
 
@@ -2097,15 +2105,15 @@ msgstr "실행 중"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "저장"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "지시문 저장"
 
@@ -2138,7 +2146,7 @@ msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 #, fuzzy
 msgid "Save successfully"
 msgstr "성공적으로 저장됨"
@@ -2189,7 +2197,7 @@ msgstr "보내기"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2234,7 +2242,7 @@ msgstr ""
 msgid "Sign in with a passkey"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "단일 지시문"
 
@@ -2792,7 +2800,7 @@ msgstr "인증서를 디스크에 쓰기"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "예"

+ 34 - 27
app/src/language/messages.pot

@@ -60,7 +60,7 @@ msgstr ""
 msgid "Add Configuration"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr ""
 
@@ -170,7 +170,7 @@ msgstr ""
 msgid "Are you sure you want to recover this item?"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr ""
 
@@ -194,7 +194,7 @@ msgstr ""
 msgid "Attempts"
 msgstr ""
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr ""
 
@@ -258,7 +258,7 @@ msgid "Base information"
 msgstr ""
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -286,7 +286,7 @@ msgstr ""
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr ""
 
@@ -322,7 +322,7 @@ msgstr ""
 msgid "Category"
 msgstr ""
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 msgid "Cert"
 msgstr ""
 
@@ -393,7 +393,7 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -428,7 +428,7 @@ msgstr ""
 msgid "Connection lost, please refresh the page."
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -592,15 +592,15 @@ msgstr ""
 msgid "Details"
 msgstr ""
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr ""
 
@@ -711,6 +711,13 @@ msgstr ""
 msgid "Do you want to remove this upstream?"
 msgstr ""
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] ""
+msgstr[1] ""
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr ""
@@ -1194,7 +1201,7 @@ msgstr ""
 msgid "Lego disable CNAME Support"
 msgstr ""
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 msgid "License"
 msgstr ""
 
@@ -1250,7 +1257,7 @@ msgstr ""
 msgid "Logout successful"
 msgstr ""
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr ""
 
@@ -1329,7 +1336,7 @@ msgstr ""
 msgid "Modify Mode"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 msgid "Multi-line Directive"
 msgstr ""
 
@@ -1388,7 +1395,7 @@ msgstr ""
 msgid "Next"
 msgstr ""
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr ""
 
@@ -1456,7 +1463,7 @@ msgstr ""
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1558,7 +1565,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr ""
 
@@ -1589,7 +1596,7 @@ msgstr ""
 msgid "Overwrite exist file"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr ""
 
@@ -1713,7 +1720,7 @@ msgid "Pre-release"
 msgstr ""
 
 #: src/routes/index.ts:266
-#: src/views/preference/Preference.vue:143
+#: src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr ""
 
@@ -1729,7 +1736,7 @@ msgstr ""
 msgid "Prohibit deleting the default user"
 msgstr ""
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr ""
 
@@ -1973,15 +1980,15 @@ msgstr ""
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr ""
 
@@ -2010,7 +2017,7 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 msgid "Save successfully"
 msgstr ""
 
@@ -2062,7 +2069,7 @@ msgstr ""
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72
 #: src/views/stream/StreamList.vue:113
@@ -2107,7 +2114,7 @@ msgstr ""
 msgid "Sign in with a passkey"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr ""
 
@@ -2588,7 +2595,7 @@ msgstr ""
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr ""

+ 35 - 27
app/src/language/ru_RU/app.po

@@ -69,7 +69,7 @@ msgstr "Добавить ключ доступа"
 msgid "Add Configuration"
 msgstr "Добавить конфигурацию"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "Добавить директиву ниже"
 
@@ -183,7 +183,7 @@ msgstr "Вы уверены, что хотите удалить?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Вы уверены, что хотите восстановить этот элемент?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "Вы уверены, что хотите удалить эту директиву?"
 
@@ -207,7 +207,7 @@ msgstr "Ассистент"
 msgid "Attempts"
 msgstr "Попытки"
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr "Авторизация"
 
@@ -269,7 +269,7 @@ msgid "Base information"
 msgstr "Основная информация"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 #, fuzzy
@@ -299,7 +299,7 @@ msgstr "Пакетное обновление"
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Ниже приведены выбранные элементы, которые вы хотите изменить"
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "Собрать с"
 
@@ -335,7 +335,7 @@ msgstr "Отмена"
 msgid "Category"
 msgstr "Категория"
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 #, fuzzy
 msgid "Cert"
 msgstr "Авто Сертификат"
@@ -406,7 +406,7 @@ msgstr "Очищено успешно"
 msgid "Command"
 msgstr "Команда"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -441,7 +441,7 @@ msgstr "Подключено"
 msgid "Connection lost, please refresh the page."
 msgstr "Соединение потеряно, пожалуйста, обновите страницу."
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -609,15 +609,15 @@ msgstr "Описание"
 msgid "Details"
 msgstr "Детали"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "Режим разработки"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "Деректива"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "Дерективы"
 
@@ -730,6 +730,14 @@ msgstr "Хотите удалить этот сервер?"
 msgid "Do you want to remove this upstream?"
 msgstr "Хотите удалить этот сервер?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "API Документ"
+msgstr[1] "API Документ"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr "Домен"
@@ -1235,7 +1243,7 @@ msgstr "Если оставить пустым, ничего не изменит
 msgid "Lego disable CNAME Support"
 msgstr "Lego отключает поддержку CNAME"
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 msgid "License"
 msgstr "Лицензия"
 
@@ -1289,7 +1297,7 @@ msgstr "Авторизация успешна"
 msgid "Logout successful"
 msgstr "Выход выполнен успешно"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr "Прокрутка"
 
@@ -1378,7 +1386,7 @@ msgstr "Изменить конфигурацию"
 msgid "Modify Mode"
 msgstr "Изменить режим"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 msgid "Multi-line Directive"
 msgstr "Многострочная директива"
 
@@ -1434,7 +1442,7 @@ msgstr "Вышла новая версия"
 msgid "Next"
 msgstr "Дальше"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1504,7 +1512,7 @@ msgstr "Nginx успешно перезапущен"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1612,7 +1620,7 @@ msgstr "После завершения проверки записи будут
 msgid "Online"
 msgstr "Онлайн"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1642,7 +1650,7 @@ msgstr "Перезаписать"
 msgid "Overwrite exist file"
 msgstr "Перезаписать существующий файл"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "Параметры"
 
@@ -1790,7 +1798,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr "Предварительный выпуск"
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "Настройки"
 
@@ -1806,7 +1814,7 @@ msgstr "Запретить изменение пароля root в демо"
 msgid "Prohibit deleting the default user"
 msgstr "Запретить удаление пользователя по умолчанию"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "Команда проекта"
 
@@ -2064,15 +2072,15 @@ msgstr "Выполняется"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "Сохранить"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "Сохранить директиву"
 
@@ -2107,7 +2115,7 @@ msgstr "Продублированно %{conf_name} в %{node_name}"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 msgid "Save successfully"
 msgstr "Сохранено успешно"
 
@@ -2159,7 +2167,7 @@ msgstr "Отправлено"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2206,7 +2214,7 @@ msgstr "Показать"
 msgid "Sign in with a passkey"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "Одиночная Директива"
 
@@ -2770,7 +2778,7 @@ msgstr "Запись сертификата на диск"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "Да"

+ 35 - 27
app/src/language/tr_TR/app.po

@@ -66,7 +66,7 @@ msgstr "Geçiş anahtarı ekleme"
 msgid "Add Configuration"
 msgstr "Yapılandırma Ekle"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "Direktifi Aşağıya Ekleyin"
 
@@ -179,7 +179,7 @@ msgstr "Silmek istediğine emin misin?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Bu öğeyi kurtarmak istediğinizden emin misiniz?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "Bu yönergeyi kaldırmak istediğinizden emin misiniz?"
 
@@ -203,7 +203,7 @@ msgstr "Asistan"
 msgid "Attempts"
 msgstr "Girişimler"
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr "Kimlik Doğrulama"
 
@@ -265,7 +265,7 @@ msgid "Base information"
 msgstr "Temel bilgiler"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -294,7 +294,7 @@ msgstr "Toplu Yükseltme"
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "İle Oluşturuldu"
 
@@ -330,7 +330,7 @@ msgstr "İptal"
 msgid "Category"
 msgstr ""
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 msgid "Cert"
 msgstr ""
 
@@ -400,7 +400,7 @@ msgstr "Başarıyla temizlendi"
 msgid "Command"
 msgstr "Komut"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -435,7 +435,7 @@ msgstr "Bağlandı"
 msgid "Connection lost, please refresh the page."
 msgstr "Bağlantı kesildi, lütfen sayfayı yenileyin."
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -601,15 +601,15 @@ msgstr "Açıklama"
 msgid "Details"
 msgstr "Detaylar"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "Geliştirme modu"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "Talimat"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "Yönergeler"
 
@@ -725,6 +725,14 @@ msgstr "Bu sunucuyu kaldırmak istiyor musunuz?"
 msgid "Do you want to remove this upstream?"
 msgstr "Bu upstream'i kaldırmak istiyor musunuz?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "API Dökümanı"
+msgstr[1] "API Dökümanı"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr "Alan Adı"
@@ -1236,7 +1244,7 @@ msgstr "Boş bırakmak hiçbir şeyi değiştirmeyecektir"
 msgid "Lego disable CNAME Support"
 msgstr "Lego CNAME desteğini devre dışı bırak"
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 msgid "License"
 msgstr "Lisans"
 
@@ -1290,7 +1298,7 @@ msgstr "Giriş Başarılı"
 msgid "Logout successful"
 msgstr "Çıkış başarılı"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr "Logrotate"
 
@@ -1394,7 +1402,7 @@ msgstr "Yapılandırmayı Değiştir"
 msgid "Modify Mode"
 msgstr "Mod Değiştir"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 #, fuzzy
 msgid "Multi-line Directive"
 msgstr "Çok Hatlı Direktif"
@@ -1460,7 +1468,7 @@ msgstr "Yeni sürüm yayınlandı"
 msgid "Next"
 msgstr "Sonraki"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 #, fuzzy
 msgid "Nginx"
 msgstr "Nginx"
@@ -1539,7 +1547,7 @@ msgstr "Nginx başarıyla yeniden başlatıldı"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1664,7 +1672,7 @@ msgstr "Doğrulama tamamlandıktan sonra kayıtlar kaldırılacaktır."
 msgid "Online"
 msgstr "Çevrimiçi"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 #, fuzzy
 msgid "OpenAI"
 msgstr "OpenAI"
@@ -1701,7 +1709,7 @@ msgstr "Üzerine yaz"
 msgid "Overwrite exist file"
 msgstr "Mevcut dosyanın üzerine yaz"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 #, fuzzy
 msgid "Params"
 msgstr "Parametreler"
@@ -1876,7 +1884,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr "Ön sürüm"
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 #, fuzzy
 msgid "Preference"
 msgstr "Tercih"
@@ -1896,7 +1904,7 @@ msgstr "Demoda kök parolasını değiştirmeyi yasakla"
 msgid "Prohibit deleting the default user"
 msgstr "Varsayılan kullanıcının silinmesini yasakla"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 #, fuzzy
 msgid "Project Team"
 msgstr "Proje Ekibi"
@@ -2202,8 +2210,8 @@ msgstr "Çalışıyor"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
@@ -2211,7 +2219,7 @@ msgstr "Çalışıyor"
 msgid "Save"
 msgstr "Kaydet"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 #, fuzzy
 msgid "Save Directive"
 msgstr "Direktifi Kaydet"
@@ -2248,7 +2256,7 @@ msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 #, fuzzy
 msgid "Save successfully"
 msgstr "Başarıyla kaydedin"
@@ -2305,7 +2313,7 @@ msgstr "Gönder"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2362,7 +2370,7 @@ msgstr "Göster"
 msgid "Sign in with a passkey"
 msgstr "Bir geçiş anahtarı ile oturum açın"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 #, fuzzy
 msgid "Single Directive"
 msgstr "Tek Direktif"
@@ -3023,7 +3031,7 @@ msgstr "Sertifikayı diske yazma"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 #, fuzzy
 msgid "Yes"

+ 35 - 27
app/src/language/vi_VN/app.po

@@ -65,7 +65,7 @@ msgstr ""
 msgid "Add Configuration"
 msgstr "Sửa cấu hình"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "Thêm Directive"
 
@@ -188,7 +188,7 @@ msgstr "Bạn chắc chắn muốn xóa nó "
 msgid "Are you sure you want to recover this item?"
 msgstr "Bạn chắc chắn muốn xoá directive này ?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "Bạn chắc chắn muốn xoá directive này ?"
 
@@ -214,7 +214,7 @@ msgstr "Trợ lý"
 msgid "Attempts"
 msgstr ""
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 #, fuzzy
 msgid "Auth"
 msgstr "Tác giả"
@@ -278,7 +278,7 @@ msgid "Base information"
 msgstr "Thông tin"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 #, fuzzy
@@ -310,7 +310,7 @@ msgstr "Cập nhật"
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "Xây dựng với"
 
@@ -346,7 +346,7 @@ msgstr "Huỷ"
 msgid "Category"
 msgstr ""
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 #, fuzzy
 msgid "Cert"
 msgstr "Tự động ký chứng chỉ SSL"
@@ -426,7 +426,7 @@ msgstr "Đã xóa thành công"
 msgid "Command"
 msgstr "Bình luận"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -462,7 +462,7 @@ msgstr "Đã kết nối"
 msgid "Connection lost, please refresh the page."
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -633,15 +633,15 @@ msgstr "Mô tả"
 msgid "Details"
 msgstr "Chi tiết"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "Chế độ phát triển"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "Directive"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "Directives"
 
@@ -763,6 +763,14 @@ msgstr "Bạn muốn xóa máy chủ này ?"
 msgid "Do you want to remove this upstream?"
 msgstr "Bạn muốn xóa máy chủ này ?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "Bình luận"
+msgstr[1] "Bình luận"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr ""
@@ -1284,7 +1292,7 @@ msgstr "Bỏ trống nếu không thay đổi"
 msgid "Lego disable CNAME Support"
 msgstr ""
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 #, fuzzy
 msgid "License"
 msgstr "Giấy phép"
@@ -1343,7 +1351,7 @@ msgstr "Đăng nhập thành công"
 msgid "Logout successful"
 msgstr "Đã đăng xuất"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr ""
 
@@ -1432,7 +1440,7 @@ msgstr "Sửa cấu hình"
 msgid "Modify Mode"
 msgstr "Sửa"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 #, fuzzy
 msgid "Multi-line Directive"
 msgstr "Single Directive"
@@ -1491,7 +1499,7 @@ msgstr "Đã có phiên bản mới"
 msgid "Next"
 msgstr "Tiếp theo"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr ""
 
@@ -1563,7 +1571,7 @@ msgstr "Restart Nginx thành công"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1672,7 +1680,7 @@ msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa."
 msgid "Online"
 msgstr "Trực tuyến"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr ""
 
@@ -1703,7 +1711,7 @@ msgstr "Ghi đè"
 msgid "Overwrite exist file"
 msgstr "Ghi đè tập tin đã tồn tại"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "Tham số"
 
@@ -1845,7 +1853,7 @@ msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "Cài đặt"
 
@@ -1862,7 +1870,7 @@ msgstr "Cấm thay đổi mật khẩu root trong demo"
 msgid "Prohibit deleting the default user"
 msgstr "Cấm xóa người dùng mặc định"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "Đội ngũ phát triển"
 
@@ -2138,15 +2146,15 @@ msgstr "Running"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "Lưu"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "Lưu Directive"
 
@@ -2179,7 +2187,7 @@ msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 #, fuzzy
 msgid "Save successfully"
 msgstr "Lưu thành công"
@@ -2230,7 +2238,7 @@ msgstr "Gửi"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2276,7 +2284,7 @@ msgstr ""
 msgid "Sign in with a passkey"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "Single Directive"
 
@@ -2826,7 +2834,7 @@ msgstr "Ghi chứng chỉ vào disk"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "Có"

+ 33 - 27
app/src/language/zh_CN/app.po

@@ -67,7 +67,7 @@ msgstr "添加 Passkey"
 msgid "Add Configuration"
 msgstr "添加配置"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "在下面添加指令"
 
@@ -176,7 +176,7 @@ msgstr "您确定要删除吗?"
 msgid "Are you sure you want to recover this item?"
 msgstr "您确定要恢复这个项目吗?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "您确定要删除这条指令?"
 
@@ -200,7 +200,7 @@ msgstr "助手"
 msgid "Attempts"
 msgstr "尝试次数"
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr "认证"
 
@@ -262,7 +262,7 @@ msgid "Base information"
 msgstr "基本信息"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -290,7 +290,7 @@ msgstr "批量升级"
 msgid "Belows are selected items that you want to batch modify"
 msgstr "以下是您选定的需要批量修改的项目"
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "构建基于"
 
@@ -326,7 +326,7 @@ msgstr "取消"
 msgid "Category"
 msgstr "分类"
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 msgid "Cert"
 msgstr "证书"
 
@@ -394,7 +394,7 @@ msgstr "清除成功"
 msgid "Command"
 msgstr "命令"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -429,7 +429,7 @@ msgstr "已连接"
 msgid "Connection lost, please refresh the page."
 msgstr "连接中断,请刷新页面。"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -591,15 +591,15 @@ msgstr "描述"
 msgid "Details"
 msgstr "详情"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "开发模式"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "指令"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "指令"
 
@@ -706,6 +706,12 @@ msgstr "你想删除这个服务器吗?"
 msgid "Do you want to remove this upstream?"
 msgstr "你想删除这个 Upstream 吗?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "文档"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr "域名"
@@ -1191,7 +1197,7 @@ msgstr "留空不做任何更改"
 msgid "Lego disable CNAME Support"
 msgstr "Lego 禁用 CNAME 支持"
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 msgid "License"
 msgstr "开源许可"
 
@@ -1245,7 +1251,7 @@ msgstr "登录成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr "Logrotate"
 
@@ -1332,7 +1338,7 @@ msgstr "修改配置文件"
 msgid "Modify Mode"
 msgstr "修改模式"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 msgid "Multi-line Directive"
 msgstr "多行指令"
 
@@ -1388,7 +1394,7 @@ msgstr "新版本发布"
 msgid "Next"
 msgstr "下一步"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1455,7 +1461,7 @@ msgstr "Nginx 重启成功"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1560,7 +1566,7 @@ msgstr "一旦验证完成,这些记录将被删除。"
 msgid "Online"
 msgstr "在线"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1590,7 +1596,7 @@ msgstr "覆盖"
 msgid "Overwrite exist file"
 msgstr "覆盖现有文件"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "参数"
 
@@ -1727,7 +1733,7 @@ msgstr "请将远程 Nginx UI 升级到最新版本"
 msgid "Pre-release"
 msgstr "预发布"
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "偏好设置"
 
@@ -1743,7 +1749,7 @@ msgstr "禁止在演示模式下修改 root 账户的密码"
 msgid "Prohibit deleting the default user"
 msgstr "禁止删除默认用户"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "项目团队"
 
@@ -1991,15 +1997,15 @@ msgstr "运行中"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "保存"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "保存指令"
 
@@ -2028,7 +2034,7 @@ msgstr "成功将站点 %{site} 保存到 %{node} 中"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 msgid "Save successfully"
 msgstr "保存成功"
 
@@ -2078,7 +2084,7 @@ msgstr "上传"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2123,7 +2129,7 @@ msgstr "显示"
 msgid "Sign in with a passkey"
 msgstr "使用 Passkey 登录"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "单行指令"
 
@@ -2653,7 +2659,7 @@ msgstr "正在将证书写入磁盘"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "是的"

+ 34 - 27
app/src/language/zh_TW/app.po

@@ -71,7 +71,7 @@ msgstr ""
 msgid "Add Configuration"
 msgstr "添加配置"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:95
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:117
 msgid "Add Directive Below"
 msgstr "在下方新增指令"
 
@@ -184,7 +184,7 @@ msgstr "您確定要刪除嗎?"
 msgid "Are you sure you want to recover this item?"
 msgstr "您確定要恢復此項目嗎?"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:88
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgstr "您確定要刪除這條指令嗎?"
 
@@ -208,7 +208,7 @@ msgstr "助理"
 msgid "Attempts"
 msgstr "嘗試次數"
 
-#: src/views/preference/Preference.vue:154
+#: src/views/preference/Preference.vue:155
 msgid "Auth"
 msgstr "身份驗證"
 
@@ -270,7 +270,7 @@ msgid "Base information"
 msgstr "基本資訊"
 
 #: src/views/config/ConfigEditor.vue:243
-#: src/views/preference/Preference.vue:148
+#: src/views/preference/Preference.vue:149
 #: src/views/site/site_edit/RightSettings.vue:79
 #: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
@@ -299,7 +299,7 @@ msgstr "批次升級"
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
-#: src/views/system/About.vue:39
+#: src/views/system/About.vue:55
 msgid "Build with"
 msgstr "構建基於"
 
@@ -335,7 +335,7 @@ msgstr "取消"
 msgid "Category"
 msgstr ""
 
-#: src/views/preference/Preference.vue:160
+#: src/views/preference/Preference.vue:161
 #, fuzzy
 msgid "Cert"
 msgstr "自動憑證"
@@ -404,7 +404,7 @@ msgstr "清除成功"
 msgid "Command"
 msgstr "命令"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:106
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:113
 #: src/views/site/ngx_conf/LocationEditor.vue:105
 #: src/views/site/ngx_conf/LocationEditor.vue:136
 #: src/views/site/ngx_conf/NgxServer.vue:134
@@ -439,7 +439,7 @@ msgstr "已連結"
 msgid "Connection lost, please refresh the page."
 msgstr "連接丟失,請重新整理。"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:111
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:118
 #: src/views/site/ngx_conf/LocationEditor.vue:117
 #: src/views/site/ngx_conf/LocationEditor.vue:145
 msgid "Content"
@@ -606,15 +606,15 @@ msgstr "描述"
 msgid "Details"
 msgstr "詳細資料"
 
-#: src/views/system/About.vue:22
+#: src/views/system/About.vue:28
 msgid "Development Mode"
 msgstr "開發模式"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:73
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89
 msgid "Directive"
 msgstr "指令"
 
-#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:21
+#: src/views/site/ngx_conf/directive/DirectiveEditor.vue:28
 msgid "Directives"
 msgstr "指令"
 
@@ -725,6 +725,13 @@ msgstr "您要移除此伺服器嗎?"
 msgid "Do you want to remove this upstream?"
 msgstr "您要移除這個 Upstream 嗎?"
 
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveDocuments.vue:15
+#, fuzzy
+msgid "Document"
+msgid_plural "Documents"
+msgstr[0] "API 文檔"
+
 #: src/views/certificate/WildcardCertificate.vue:68
 msgid "Domain"
 msgstr "網域"
@@ -1216,7 +1223,7 @@ msgstr "留空將不會改變任何內容"
 msgid "Lego disable CNAME Support"
 msgstr "Lego 停用 CNAME 支援"
 
-#: src/views/system/About.vue:47
+#: src/views/system/About.vue:63
 msgid "License"
 msgstr "開源授權"
 
@@ -1270,7 +1277,7 @@ msgstr "登入成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
-#: src/views/preference/Preference.vue:178
+#: src/views/preference/Preference.vue:179
 msgid "Logrotate"
 msgstr "Logrotate"
 
@@ -1356,7 +1363,7 @@ msgstr "修改設定"
 msgid "Modify Mode"
 msgstr "修改模式"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:54
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:68
 msgid "Multi-line Directive"
 msgstr "多行指令"
 
@@ -1412,7 +1419,7 @@ msgstr "新版本發布"
 msgid "Next"
 msgstr "下一步"
 
-#: src/views/preference/Preference.vue:166
+#: src/views/preference/Preference.vue:167
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1482,7 +1489,7 @@ msgstr "Nginx 重啟成功"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/AuthSettings.vue:138
 #: src/views/preference/CertSettings.vue:70
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:90
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:90
 #: src/views/site/site_list/SiteList.vue:148
 #: src/views/stream/StreamList.vue:164
@@ -1588,7 +1595,7 @@ msgstr "驗證完成後,記錄將被刪除。"
 msgid "Online"
 msgstr "線上"
 
-#: src/views/preference/Preference.vue:172
+#: src/views/preference/Preference.vue:173
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1618,7 +1625,7 @@ msgstr "覆蓋"
 msgid "Overwrite exist file"
 msgstr "覆蓋現有檔案"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:78
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94
 msgid "Params"
 msgstr "參數"
 
@@ -1758,7 +1765,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr "預先發布"
 
-#: src/routes/index.ts:266 src/views/preference/Preference.vue:143
+#: src/routes/index.ts:266 src/views/preference/Preference.vue:144
 msgid "Preference"
 msgstr "偏好設定"
 
@@ -1774,7 +1781,7 @@ msgstr "在示範模式中禁止更改 root 密碼"
 msgid "Prohibit deleting the default user"
 msgstr "禁止刪除預設使用者"
 
-#: src/views/system/About.vue:35
+#: src/views/system/About.vue:51
 msgid "Project Team"
 msgstr "專案團隊"
 
@@ -2032,15 +2039,15 @@ msgstr "執行中"
 #: src/views/config/components/ConfigName.vue:58
 #: src/views/config/ConfigEditor.vue:224
 #: src/views/preference/components/Passkey.vue:136
-#: src/views/preference/Preference.vue:189
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:120
+#: src/views/preference/Preference.vue:190
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127
 #: src/views/site/site_edit/components/ConfigName.vue:54
 #: src/views/site/site_edit/SiteEdit.vue:271
 #: src/views/stream/StreamEdit.vue:252
 msgid "Save"
 msgstr "儲存"
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:105
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:127
 msgid "Save Directive"
 msgstr "儲存指令"
 
@@ -2073,7 +2080,7 @@ msgstr "成功複製 %{conf_name} 到 %{node_name}"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/views/certificate/CertificateEditor.vue:49
-#: src/views/preference/Preference.vue:112
+#: src/views/preference/Preference.vue:113
 msgid "Save successfully"
 msgstr "儲存成功"
 
@@ -2123,7 +2130,7 @@ msgstr "傳送"
 #: src/views/preference/components/Passkey.vue:56
 #: src/views/preference/components/TOTP.vue:44
 #: src/views/preference/components/TOTP.vue:57
-#: src/views/preference/Preference.vue:116
+#: src/views/preference/Preference.vue:117
 #: src/views/site/site_list/SiteList.vue:40
 #: src/views/site/site_list/SiteList.vue:72 src/views/stream/StreamList.vue:113
 #: src/views/stream/StreamList.vue:81 src/views/system/Upgrade.vue:42
@@ -2168,7 +2175,7 @@ msgstr "顯示"
 msgid "Sign in with a passkey"
 msgstr ""
 
-#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:51
+#: src/views/site/ngx_conf/directive/DirectiveAdd.vue:65
 msgid "Single Directive"
 msgstr "單一指令"
 
@@ -2700,7 +2707,7 @@ msgstr "將憑證寫入磁碟"
 
 #: src/views/preference/AuthSettings.vue:137
 #: src/views/preference/CertSettings.vue:69
-#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:89
+#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/LocationEditor.vue:89
 msgid "Yes"
 msgstr "是的"

+ 25 - 3
app/src/views/site/ngx_conf/directive/DirectiveAdd.vue

@@ -1,11 +1,11 @@
 <script setup lang="ts">
-import type { NgxDirective } from '@/api/ngx'
+import type { DirectiveMap, NgxDirective } from '@/api/ngx'
 import CodeEditor from '@/components/CodeEditor'
 import { DeleteOutlined } from '@ant-design/icons-vue'
-import { type ComputedRef, reactive, ref } from 'vue'
 
 const props = defineProps<{
   idx?: number
+  nginxDirectivesMap?: DirectiveMap
 }>()
 
 const emit = defineEmits(['save'])
@@ -15,6 +15,16 @@ const directive = reactive({ directive: '', params: '' })
 const adding = ref(false)
 const mode = ref('default')
 
+const nginxDirectives = computed(() => {
+  const res: { label: string, value: string }[] = []
+  if (props.nginxDirectivesMap) {
+    Object.keys(props.nginxDirectivesMap).forEach(k => {
+      res.push({ label: k, value: k })
+    })
+  }
+  return res
+})
+
 function add() {
   adding.value = true
   directive.directive = ''
@@ -33,6 +43,10 @@ function save() {
 
   emit('save', props.idx)
 }
+
+function filterOption(inputValue: string, option: { label: string }) {
+  return option.label.toLowerCase().includes(inputValue.toLowerCase())
+}
 </script>
 
 <template>
@@ -67,9 +81,11 @@ function save() {
             v-else
             compact
           >
-            <AInput
+            <AAutoComplete
               v-model:value="directive.directive"
+              :options="nginxDirectives"
               style="width: 30%"
+              :filter-option="filterOption"
               :placeholder="$gettext('Directive')"
             />
             <AInput
@@ -85,6 +101,12 @@ function save() {
             </template>
           </AButton>
         </div>
+        <div v-if="nginxDirectivesMap?.[directive.directive]" class="mt-2">
+          <div>{{ $ngettext('Document', 'Documents', nginxDirectivesMap[directive.directive].links.length) }}</div>
+          <a v-for="(link, index) in nginxDirectivesMap?.[directive.directive].links" :key="index" :href="link">
+            {{ link }}
+          </a>
+        </div>
       </AFormItem>
     </div>
     <AButton

+ 28 - 0
app/src/views/site/ngx_conf/directive/DirectiveDocuments.vue

@@ -0,0 +1,28 @@
+<script setup lang="ts">
+import type { DirectiveMap } from '@/api/ngx'
+
+const props = defineProps<{
+  directive: string
+  nginxDirectivesMap?: DirectiveMap
+}>()
+</script>
+
+<template>
+  <AFormItem
+    v-if="nginxDirectivesMap?.[props.directive]"
+    class="mb-0"
+    :label="
+      $ngettext('Document', 'Documents',
+                nginxDirectivesMap[props.directive].links.length)"
+  >
+    <div v-for="(link, idx) in nginxDirectivesMap?.[props.directive]?.links" :key="idx" class="mb-2">
+      <a :href="link">
+        {{ link }}
+      </a>
+    </div>
+  </AFormItem>
+</template>
+
+<style scoped lang="less">
+
+</style>

+ 10 - 1
app/src/views/site/ngx_conf/directive/DirectiveEditor.vue

@@ -1,6 +1,7 @@
 <script setup lang="ts">
-import type { NgxDirective } from '@/api/ngx'
+import type { DirectiveMap, NgxDirective } from '@/api/ngx'
 import type { ComputedRef } from 'vue'
+import ngx from '@/api/ngx'
 import DirectiveEditorItem from '@/views/site/ngx_conf/directive/DirectiveEditorItem.vue'
 import Draggable from 'vuedraggable'
 import DirectiveAdd from './DirectiveAdd.vue'
@@ -15,6 +16,12 @@ const current_idx = ref(-1)
 const ngx_directives = inject('ngx_directives') as ComputedRef<NgxDirective[]>
 
 provide('current_idx', current_idx)
+
+const nginxDirectivesMap = shallowRef<DirectiveMap>()
+
+onMounted(async () => {
+  nginxDirectivesMap.value = await ngx.get_directives()
+})
 </script>
 
 <template>
@@ -33,6 +40,7 @@ provide('current_idx', current_idx)
         :index="index"
         :readonly="readonly"
         :context="context"
+        :nginx-directives-map
         @click="current_idx = index"
       >
         <template
@@ -51,6 +59,7 @@ provide('current_idx', current_idx)
   <DirectiveAdd
     v-if="!readonly"
     v-auto-animate
+    :nginx-directives-map
   />
 </template>
 

+ 8 - 2
app/src/views/site/ngx_conf/directive/DirectiveEditorItem.vue

@@ -1,7 +1,8 @@
 <script setup lang="ts">
-import type { NgxDirective } from '@/api/ngx'
+import type { DirectiveMap, NgxDirective } from '@/api/ngx'
 import config from '@/api/config'
 import CodeEditor from '@/components/CodeEditor'
+import DirectiveDocuments from '@/views/site/ngx_conf/directive/DirectiveDocuments.vue'
 import { DeleteOutlined, HolderOutlined, InfoCircleOutlined } from '@ant-design/icons-vue'
 import { message } from 'ant-design-vue'
 
@@ -9,6 +10,7 @@ const props = defineProps<{
   index: number
   readonly?: boolean
   context?: string
+  nginxDirectivesMap?: DirectiveMap
 }>()
 
 const ngxDirectives = inject('ngx_directives') as ComputedRef<NgxDirective[]>
@@ -126,6 +128,10 @@ const showComment = ref(false)
               </AButton>
             </div>
           </AFormItem>
+          <DirectiveDocuments
+            :directive="ngxDirectives[props.index].directive"
+            :nginx-directives-map
+          />
         </AForm>
       </div>
     </div>
@@ -173,7 +179,7 @@ const showComment = ref(false)
 }
 
 .fade-enter-active, .fade-leave-active {
-  transition: all .2s ease-in-out;
+  transition: all .16s ease-in-out;
 }
 
 .fade-enter-from, .fade-enter-to, .fade-leave-to

+ 0 - 0
cmd/generate/generate.go → cmd/gen/generate.go


+ 113 - 0
cmd/parse_ngx_index/parse_ngx_index.go

@@ -0,0 +1,113 @@
+package main
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"os"
+	"strings"
+
+	"golang.org/x/net/html"
+)
+
+type Directive struct {
+	Links []string `json:"links"`
+}
+
+func main() {
+	// Fetch page content
+	resp, err := http.Get("https://nginx.org/en/docs/dirindex.html")
+	if err != nil {
+		fmt.Println("Error fetching page:", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	// Parse HTML
+	doc, err := html.Parse(resp.Body)
+	if err != nil {
+		fmt.Println("Error parsing HTML:", err)
+		return
+	}
+
+	// Change storage structure to map
+	directives := make(map[string]Directive)
+
+	// Find node with id="content"
+	var content *html.Node
+	var findContent func(*html.Node)
+	findContent = func(n *html.Node) {
+		if n.Type == html.ElementNode && n.Data == "div" {
+			for _, attr := range n.Attr {
+				if attr.Key == "id" && attr.Val == "content" {
+					content = n
+					return
+				}
+			}
+		}
+		for c := n.FirstChild; c != nil; c = c.NextSibling {
+			findContent(c)
+		}
+	}
+	findContent(doc)
+
+	// Extract all a tags from content
+	if content != nil {
+		var extractLinks func(*html.Node)
+		extractLinks = func(n *html.Node) {
+			if n.Type == html.ElementNode && n.Data == "a" {
+				var href string
+				for _, attr := range n.Attr {
+					if attr.Key == "href" {
+						href = attr.Val
+						break
+					}
+				}
+				if href != "" && n.FirstChild != nil {
+					name := strings.TrimSpace(n.FirstChild.Data)
+					if name != "" {
+						fullLink := "https://nginx.org/en/docs/" + href
+						directive, exists := directives[name]
+						if !exists {
+							directives[name] = Directive{
+								Links: []string{fullLink},
+							}
+						} else {
+							// Check if link already exists to avoid duplicates
+							linkExists := false
+							for _, existingLink := range directive.Links {
+								if existingLink == fullLink {
+									linkExists = true
+									break
+								}
+							}
+							if !linkExists {
+								directive.Links = append(directive.Links, fullLink)
+								directives[name] = directive
+							}
+						}
+					}
+				}
+			}
+			for c := n.FirstChild; c != nil; c = c.NextSibling {
+				extractLinks(c)
+			}
+		}
+		extractLinks(content)
+	}
+
+	// Write results to JSON file
+	jsonData, err := json.MarshalIndent(directives, "", "  ")
+	if err != nil {
+		fmt.Println("Error marshaling JSON:", err)
+		return
+	}
+
+	err = os.WriteFile("../../internal/nginx/nginx_directives.json", jsonData, 0644)
+	if err != nil {
+		fmt.Println("Error writing file:", err)
+		return
+	}
+
+	fmt.Printf("Successfully parsed %d directives and saved to nginx_directives.json\n", len(directives))
+}

+ 1 - 1
gen.sh

@@ -1,3 +1,3 @@
-pushd ./cmd/generate || exit
+pushd ./cmd/gen || exit
 go run generate.go -config ../../app.ini
 popd || exit

+ 22 - 0
internal/nginx/directives.go

@@ -0,0 +1,22 @@
+package nginx
+
+import (
+	_ "embed"
+	"encoding/json"
+)
+
+//go:embed nginx_directives.json
+var directivesJson []byte
+
+type Directive struct {
+	Links []string `json:"links"`
+}
+
+func GetDirectives() (map[string]Directive, error) {
+	var directives map[string]Directive
+	err := json.Unmarshal(directivesJson, &directives)
+	if err != nil {
+		return nil, err
+	}
+	return directives, nil
+}

+ 3670 - 0
internal/nginx/nginx_directives.json

@@ -0,0 +1,3670 @@
+{
+  "absolute_redirect": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#absolute_redirect"
+    ]
+  },
+  "accept_mutex": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#accept_mutex"
+    ]
+  },
+  "accept_mutex_delay": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#accept_mutex_delay"
+    ]
+  },
+  "access_log": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_log_module.html#access_log",
+      "https://nginx.org/en/docs/stream/ngx_stream_log_module.html#access_log"
+    ]
+  },
+  "add_after_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_addition_module.html#add_after_body"
+    ]
+  },
+  "add_before_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_addition_module.html#add_before_body"
+    ]
+  },
+  "add_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header"
+    ]
+  },
+  "add_trailer": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_headers_module.html#add_trailer"
+    ]
+  },
+  "addition_types": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_addition_module.html#addition_types"
+    ]
+  },
+  "aio": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#aio"
+    ]
+  },
+  "aio_write": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#aio_write"
+    ]
+  },
+  "alias": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#alias"
+    ]
+  },
+  "allow": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_access_module.html#allow",
+      "https://nginx.org/en/docs/stream/ngx_stream_access_module.html#allow"
+    ]
+  },
+  "ancient_browser": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_browser_module.html#ancient_browser"
+    ]
+  },
+  "ancient_browser_value": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_browser_module.html#ancient_browser_value"
+    ]
+  },
+  "api": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_api_module.html#api"
+    ]
+  },
+  "auth_basic": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html#auth_basic"
+    ]
+  },
+  "auth_basic_user_file": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html#auth_basic_user_file"
+    ]
+  },
+  "auth_delay": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#auth_delay"
+    ]
+  },
+  "auth_http": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html#auth_http"
+    ]
+  },
+  "auth_http_header": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html#auth_http_header"
+    ]
+  },
+  "auth_http_pass_client_cert": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html#auth_http_pass_client_cert"
+    ]
+  },
+  "auth_http_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_auth_http_module.html#auth_http_timeout"
+    ]
+  },
+  "auth_jwt": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt"
+    ]
+  },
+  "auth_jwt_claim_set": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_claim_set"
+    ]
+  },
+  "auth_jwt_header_set": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_header_set"
+    ]
+  },
+  "auth_jwt_key_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_key_cache"
+    ]
+  },
+  "auth_jwt_key_file": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_key_file"
+    ]
+  },
+  "auth_jwt_key_request": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_key_request"
+    ]
+  },
+  "auth_jwt_leeway": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_leeway"
+    ]
+  },
+  "auth_jwt_require": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_require"
+    ]
+  },
+  "auth_jwt_type": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html#auth_jwt_type"
+    ]
+  },
+  "auth_request": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_request_module.html#auth_request"
+    ]
+  },
+  "auth_request_set": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_auth_request_module.html#auth_request_set"
+    ]
+  },
+  "autoindex": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex"
+    ]
+  },
+  "autoindex_exact_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex_exact_size"
+    ]
+  },
+  "autoindex_format": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex_format"
+    ]
+  },
+  "autoindex_localtime": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex_localtime"
+    ]
+  },
+  "break": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#break"
+    ]
+  },
+  "charset": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_charset_module.html#charset"
+    ]
+  },
+  "charset_map": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_charset_module.html#charset_map"
+    ]
+  },
+  "charset_types": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_charset_module.html#charset_types"
+    ]
+  },
+  "chunked_transfer_encoding": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#chunked_transfer_encoding"
+    ]
+  },
+  "client_body_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size"
+    ]
+  },
+  "client_body_in_file_only": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only"
+    ]
+  },
+  "client_body_in_single_buffer": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_single_buffer"
+    ]
+  },
+  "client_body_temp_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_temp_path"
+    ]
+  },
+  "client_body_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout"
+    ]
+  },
+  "client_header_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size"
+    ]
+  },
+  "client_header_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout"
+    ]
+  },
+  "client_max_body_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size"
+    ]
+  },
+  "connection_pool_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#connection_pool_size"
+    ]
+  },
+  "create_full_put_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_dav_module.html#create_full_put_path"
+    ]
+  },
+  "daemon": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#daemon"
+    ]
+  },
+  "dav_access": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_access"
+    ]
+  },
+  "dav_methods": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods"
+    ]
+  },
+  "debug_connection": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#debug_connection"
+    ]
+  },
+  "debug_points": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#debug_points"
+    ]
+  },
+  "default_type": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#default_type"
+    ]
+  },
+  "deny": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_access_module.html#deny",
+      "https://nginx.org/en/docs/stream/ngx_stream_access_module.html#deny"
+    ]
+  },
+  "directio": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#directio"
+    ]
+  },
+  "directio_alignment": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#directio_alignment"
+    ]
+  },
+  "disable_symlinks": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#disable_symlinks"
+    ]
+  },
+  "empty_gif": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_empty_gif_module.html#empty_gif"
+    ]
+  },
+  "enforce_initial_report": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#enforce_initial_report"
+    ]
+  },
+  "env": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#env"
+    ]
+  },
+  "error_log": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#error_log"
+    ]
+  },
+  "error_page": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#error_page"
+    ]
+  },
+  "etag": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#etag"
+    ]
+  },
+  "events": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#events"
+    ]
+  },
+  "expires": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_headers_module.html#expires"
+    ]
+  },
+  "f4f": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_f4f_module.html#f4f"
+    ]
+  },
+  "f4f_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_f4f_module.html#f4f_buffer_size"
+    ]
+  },
+  "fastcgi_bind": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_bind"
+    ]
+  },
+  "fastcgi_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffer_size"
+    ]
+  },
+  "fastcgi_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffering"
+    ]
+  },
+  "fastcgi_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffers"
+    ]
+  },
+  "fastcgi_busy_buffers_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_busy_buffers_size"
+    ]
+  },
+  "fastcgi_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache"
+    ]
+  },
+  "fastcgi_cache_background_update": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_background_update"
+    ]
+  },
+  "fastcgi_cache_bypass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_bypass"
+    ]
+  },
+  "fastcgi_cache_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_key"
+    ]
+  },
+  "fastcgi_cache_lock": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_lock"
+    ]
+  },
+  "fastcgi_cache_lock_age": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_lock_age"
+    ]
+  },
+  "fastcgi_cache_lock_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_lock_timeout"
+    ]
+  },
+  "fastcgi_cache_max_range_offset": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_max_range_offset"
+    ]
+  },
+  "fastcgi_cache_methods": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_methods"
+    ]
+  },
+  "fastcgi_cache_min_uses": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_min_uses"
+    ]
+  },
+  "fastcgi_cache_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_path"
+    ]
+  },
+  "fastcgi_cache_purge": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_purge"
+    ]
+  },
+  "fastcgi_cache_revalidate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_revalidate"
+    ]
+  },
+  "fastcgi_cache_use_stale": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_use_stale"
+    ]
+  },
+  "fastcgi_cache_valid": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_valid"
+    ]
+  },
+  "fastcgi_catch_stderr": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_catch_stderr"
+    ]
+  },
+  "fastcgi_connect_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_connect_timeout"
+    ]
+  },
+  "fastcgi_force_ranges": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_force_ranges"
+    ]
+  },
+  "fastcgi_hide_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_hide_header"
+    ]
+  },
+  "fastcgi_ignore_client_abort": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_ignore_client_abort"
+    ]
+  },
+  "fastcgi_ignore_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_ignore_headers"
+    ]
+  },
+  "fastcgi_index": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_index"
+    ]
+  },
+  "fastcgi_intercept_errors": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_intercept_errors"
+    ]
+  },
+  "fastcgi_keep_conn": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_keep_conn"
+    ]
+  },
+  "fastcgi_limit_rate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_limit_rate"
+    ]
+  },
+  "fastcgi_max_temp_file_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_max_temp_file_size"
+    ]
+  },
+  "fastcgi_next_upstream": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_next_upstream"
+    ]
+  },
+  "fastcgi_next_upstream_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_next_upstream_timeout"
+    ]
+  },
+  "fastcgi_next_upstream_tries": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_next_upstream_tries"
+    ]
+  },
+  "fastcgi_no_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_no_cache"
+    ]
+  },
+  "fastcgi_param": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param"
+    ]
+  },
+  "fastcgi_pass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass"
+    ]
+  },
+  "fastcgi_pass_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass_header"
+    ]
+  },
+  "fastcgi_pass_request_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass_request_body"
+    ]
+  },
+  "fastcgi_pass_request_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass_request_headers"
+    ]
+  },
+  "fastcgi_read_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout"
+    ]
+  },
+  "fastcgi_request_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_request_buffering"
+    ]
+  },
+  "fastcgi_send_lowat": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_send_lowat"
+    ]
+  },
+  "fastcgi_send_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_send_timeout"
+    ]
+  },
+  "fastcgi_socket_keepalive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_socket_keepalive"
+    ]
+  },
+  "fastcgi_split_path_info": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info"
+    ]
+  },
+  "fastcgi_store": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_store"
+    ]
+  },
+  "fastcgi_store_access": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_store_access"
+    ]
+  },
+  "fastcgi_temp_file_write_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_temp_file_write_size"
+    ]
+  },
+  "fastcgi_temp_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_temp_path"
+    ]
+  },
+  "flv": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_flv_module.html#flv"
+    ]
+  },
+  "geo": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_geo_module.html#geo",
+      "https://nginx.org/en/docs/stream/ngx_stream_geo_module.html#geo"
+    ]
+  },
+  "geoip_city": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_city",
+      "https://nginx.org/en/docs/stream/ngx_stream_geoip_module.html#geoip_city"
+    ]
+  },
+  "geoip_country": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_country",
+      "https://nginx.org/en/docs/stream/ngx_stream_geoip_module.html#geoip_country"
+    ]
+  },
+  "geoip_org": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_org",
+      "https://nginx.org/en/docs/stream/ngx_stream_geoip_module.html#geoip_org"
+    ]
+  },
+  "geoip_proxy": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_proxy"
+    ]
+  },
+  "geoip_proxy_recursive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_proxy_recursive"
+    ]
+  },
+  "google_perftools_profiles": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_google_perftools_module.html#google_perftools_profiles"
+    ]
+  },
+  "grpc_bind": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_bind"
+    ]
+  },
+  "grpc_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_buffer_size"
+    ]
+  },
+  "grpc_connect_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_connect_timeout"
+    ]
+  },
+  "grpc_hide_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_hide_header"
+    ]
+  },
+  "grpc_ignore_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ignore_headers"
+    ]
+  },
+  "grpc_intercept_errors": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_intercept_errors"
+    ]
+  },
+  "grpc_next_upstream": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_next_upstream"
+    ]
+  },
+  "grpc_next_upstream_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_next_upstream_timeout"
+    ]
+  },
+  "grpc_next_upstream_tries": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_next_upstream_tries"
+    ]
+  },
+  "grpc_pass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_pass"
+    ]
+  },
+  "grpc_pass_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_pass_header"
+    ]
+  },
+  "grpc_read_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_read_timeout"
+    ]
+  },
+  "grpc_send_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_send_timeout"
+    ]
+  },
+  "grpc_set_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_set_header"
+    ]
+  },
+  "grpc_socket_keepalive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_socket_keepalive"
+    ]
+  },
+  "grpc_ssl_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_certificate"
+    ]
+  },
+  "grpc_ssl_certificate_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_certificate_key"
+    ]
+  },
+  "grpc_ssl_ciphers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_ciphers"
+    ]
+  },
+  "grpc_ssl_conf_command": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_conf_command"
+    ]
+  },
+  "grpc_ssl_crl": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_crl"
+    ]
+  },
+  "grpc_ssl_key_log": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_key_log"
+    ]
+  },
+  "grpc_ssl_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_name"
+    ]
+  },
+  "grpc_ssl_password_file": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_password_file"
+    ]
+  },
+  "grpc_ssl_protocols": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_protocols"
+    ]
+  },
+  "grpc_ssl_server_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_server_name"
+    ]
+  },
+  "grpc_ssl_session_reuse": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_session_reuse"
+    ]
+  },
+  "grpc_ssl_trusted_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_trusted_certificate"
+    ]
+  },
+  "grpc_ssl_verify": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_verify"
+    ]
+  },
+  "grpc_ssl_verify_depth": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_ssl_verify_depth"
+    ]
+  },
+  "gunzip": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gunzip_module.html#gunzip"
+    ]
+  },
+  "gunzip_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gunzip_module.html#gunzip_buffers"
+    ]
+  },
+  "gzip": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip"
+    ]
+  },
+  "gzip_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_buffers"
+    ]
+  },
+  "gzip_comp_level": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_comp_level"
+    ]
+  },
+  "gzip_disable": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_disable"
+    ]
+  },
+  "gzip_http_version": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version"
+    ]
+  },
+  "gzip_min_length": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_min_length"
+    ]
+  },
+  "gzip_proxied": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied"
+    ]
+  },
+  "gzip_static": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_static_module.html#gzip_static"
+    ]
+  },
+  "gzip_types": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_types"
+    ]
+  },
+  "gzip_vary": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_vary"
+    ]
+  },
+  "hash": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#hash",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#hash"
+    ]
+  },
+  "health_check": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_hc_module.html#health_check",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_hc_module.html#health_check"
+    ]
+  },
+  "health_check_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_hc_module.html#health_check_timeout"
+    ]
+  },
+  "hls": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_hls_module.html#hls"
+    ]
+  },
+  "hls_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_hls_module.html#hls_buffers"
+    ]
+  },
+  "hls_forward_args": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_hls_module.html#hls_forward_args"
+    ]
+  },
+  "hls_fragment": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_hls_module.html#hls_fragment"
+    ]
+  },
+  "hls_mp4_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_hls_module.html#hls_mp4_buffer_size"
+    ]
+  },
+  "hls_mp4_max_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_hls_module.html#hls_mp4_max_buffer_size"
+    ]
+  },
+  "http": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#http"
+    ]
+  },
+  "http2": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2"
+    ]
+  },
+  "http2_body_preread_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_body_preread_size"
+    ]
+  },
+  "http2_chunk_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_chunk_size"
+    ]
+  },
+  "http2_idle_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_idle_timeout"
+    ]
+  },
+  "http2_max_concurrent_pushes": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_max_concurrent_pushes"
+    ]
+  },
+  "http2_max_concurrent_streams": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_max_concurrent_streams"
+    ]
+  },
+  "http2_max_field_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_max_field_size"
+    ]
+  },
+  "http2_max_header_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_max_header_size"
+    ]
+  },
+  "http2_max_requests": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_max_requests"
+    ]
+  },
+  "http2_push": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_push"
+    ]
+  },
+  "http2_push_preload": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_push_preload"
+    ]
+  },
+  "http2_recv_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_recv_buffer_size"
+    ]
+  },
+  "http2_recv_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_recv_timeout"
+    ]
+  },
+  "http3": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#http3"
+    ]
+  },
+  "http3_hq": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#http3_hq"
+    ]
+  },
+  "http3_max_concurrent_streams": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#http3_max_concurrent_streams"
+    ]
+  },
+  "http3_stream_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#http3_stream_buffer_size"
+    ]
+  },
+  "if": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if"
+    ]
+  },
+  "if_modified_since": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since"
+    ]
+  },
+  "ignore_invalid_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#ignore_invalid_headers"
+    ]
+  },
+  "image_filter": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_image_filter_module.html#image_filter"
+    ]
+  },
+  "image_filter_buffer": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_image_filter_module.html#image_filter_buffer"
+    ]
+  },
+  "image_filter_interlace": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_image_filter_module.html#image_filter_interlace"
+    ]
+  },
+  "image_filter_jpeg_quality": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_image_filter_module.html#image_filter_jpeg_quality"
+    ]
+  },
+  "image_filter_sharpen": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_image_filter_module.html#image_filter_sharpen"
+    ]
+  },
+  "image_filter_transparency": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_image_filter_module.html#image_filter_transparency"
+    ]
+  },
+  "image_filter_webp_quality": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_image_filter_module.html#image_filter_webp_quality"
+    ]
+  },
+  "imap_auth": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_imap_module.html#imap_auth"
+    ]
+  },
+  "imap_capabilities": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_imap_module.html#imap_capabilities"
+    ]
+  },
+  "imap_client_buffer": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_imap_module.html#imap_client_buffer"
+    ]
+  },
+  "include": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#include"
+    ]
+  },
+  "index": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_index_module.html#index"
+    ]
+  },
+  "internal": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#internal"
+    ]
+  },
+  "internal_redirect": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_internal_redirect_module.html#internal_redirect"
+    ]
+  },
+  "ip_hash": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash"
+    ]
+  },
+  "js_access": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_access"
+    ]
+  },
+  "js_body_filter": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_body_filter"
+    ]
+  },
+  "js_content": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_content"
+    ]
+  },
+  "js_context_reuse": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_context_reuse",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_context_reuse"
+    ]
+  },
+  "js_engine": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_engine",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_engine"
+    ]
+  },
+  "js_fetch_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_buffer_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_buffer_size"
+    ]
+  },
+  "js_fetch_ciphers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_ciphers",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_ciphers"
+    ]
+  },
+  "js_fetch_max_response_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_max_response_buffer_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_max_response_buffer_size"
+    ]
+  },
+  "js_fetch_protocols": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_protocols",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_protocols"
+    ]
+  },
+  "js_fetch_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_timeout",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_timeout"
+    ]
+  },
+  "js_fetch_trusted_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_trusted_certificate",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_trusted_certificate"
+    ]
+  },
+  "js_fetch_verify": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_verify",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_verify"
+    ]
+  },
+  "js_fetch_verify_depth": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_fetch_verify_depth",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_fetch_verify_depth"
+    ]
+  },
+  "js_filter": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_filter"
+    ]
+  },
+  "js_header_filter": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_header_filter"
+    ]
+  },
+  "js_import": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_import",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_import"
+    ]
+  },
+  "js_include": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_include",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_include"
+    ]
+  },
+  "js_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_path",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_path"
+    ]
+  },
+  "js_periodic": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_periodic",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_periodic"
+    ]
+  },
+  "js_preload_object": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_preload_object",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_preload_object"
+    ]
+  },
+  "js_preread": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_preread"
+    ]
+  },
+  "js_set": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_set",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_set"
+    ]
+  },
+  "js_shared_dict_zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_shared_dict_zone",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_shared_dict_zone"
+    ]
+  },
+  "js_var": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_js_module.html#js_var",
+      "https://nginx.org/en/docs/stream/ngx_stream_js_module.html#js_var"
+    ]
+  },
+  "keepalive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive"
+    ]
+  },
+  "keepalive_disable": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_disable"
+    ]
+  },
+  "keepalive_requests": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_requests",
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive_requests"
+    ]
+  },
+  "keepalive_time": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_time",
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive_time"
+    ]
+  },
+  "keepalive_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout",
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive_timeout"
+    ]
+  },
+  "keyval": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_keyval_module.html#keyval",
+      "https://nginx.org/en/docs/stream/ngx_stream_keyval_module.html#keyval"
+    ]
+  },
+  "keyval_zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_keyval_module.html#keyval_zone",
+      "https://nginx.org/en/docs/stream/ngx_stream_keyval_module.html#keyval_zone"
+    ]
+  },
+  "large_client_header_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers"
+    ]
+  },
+  "least_conn": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#least_conn",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#least_conn"
+    ]
+  },
+  "least_time": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#least_time",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#least_time"
+    ]
+  },
+  "license_token": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#license_token"
+    ]
+  },
+  "limit_conn": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn",
+      "https://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html#limit_conn"
+    ]
+  },
+  "limit_conn_dry_run": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_dry_run",
+      "https://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html#limit_conn_dry_run"
+    ]
+  },
+  "limit_conn_log_level": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_log_level",
+      "https://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html#limit_conn_log_level"
+    ]
+  },
+  "limit_conn_status": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_status"
+    ]
+  },
+  "limit_conn_zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone",
+      "https://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html#limit_conn_zone"
+    ]
+  },
+  "limit_except": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_except"
+    ]
+  },
+  "limit_rate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate"
+    ]
+  },
+  "limit_rate_after": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate_after"
+    ]
+  },
+  "limit_req": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req"
+    ]
+  },
+  "limit_req_dry_run": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_dry_run"
+    ]
+  },
+  "limit_req_log_level": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_log_level"
+    ]
+  },
+  "limit_req_status": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_status"
+    ]
+  },
+  "limit_req_zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone"
+    ]
+  },
+  "limit_zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_zone"
+    ]
+  },
+  "lingering_close": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#lingering_close"
+    ]
+  },
+  "lingering_time": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#lingering_time"
+    ]
+  },
+  "lingering_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#lingering_timeout"
+    ]
+  },
+  "listen": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#listen",
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#listen",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#listen"
+    ]
+  },
+  "load_module": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#load_module"
+    ]
+  },
+  "location": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#location"
+    ]
+  },
+  "lock_file": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#lock_file"
+    ]
+  },
+  "log_format": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_log_module.html#log_format",
+      "https://nginx.org/en/docs/stream/ngx_stream_log_module.html#log_format"
+    ]
+  },
+  "log_not_found": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#log_not_found"
+    ]
+  },
+  "log_subrequest": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#log_subrequest"
+    ]
+  },
+  "mail": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#mail"
+    ]
+  },
+  "map": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_map_module.html#map",
+      "https://nginx.org/en/docs/stream/ngx_stream_map_module.html#map"
+    ]
+  },
+  "map_hash_bucket_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_map_module.html#map_hash_bucket_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_map_module.html#map_hash_bucket_size"
+    ]
+  },
+  "map_hash_max_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_map_module.html#map_hash_max_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_map_module.html#map_hash_max_size"
+    ]
+  },
+  "master_process": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#master_process"
+    ]
+  },
+  "match": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_hc_module.html#match",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_hc_module.html#match"
+    ]
+  },
+  "max_errors": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#max_errors"
+    ]
+  },
+  "max_ranges": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#max_ranges"
+    ]
+  },
+  "memcached_bind": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_bind"
+    ]
+  },
+  "memcached_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_buffer_size"
+    ]
+  },
+  "memcached_connect_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_connect_timeout"
+    ]
+  },
+  "memcached_gzip_flag": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_gzip_flag"
+    ]
+  },
+  "memcached_next_upstream": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_next_upstream"
+    ]
+  },
+  "memcached_next_upstream_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_next_upstream_timeout"
+    ]
+  },
+  "memcached_next_upstream_tries": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_next_upstream_tries"
+    ]
+  },
+  "memcached_pass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_pass"
+    ]
+  },
+  "memcached_read_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_read_timeout"
+    ]
+  },
+  "memcached_send_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_send_timeout"
+    ]
+  },
+  "memcached_socket_keepalive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_socket_keepalive"
+    ]
+  },
+  "merge_slashes": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#merge_slashes"
+    ]
+  },
+  "mgmt": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#mgmt"
+    ]
+  },
+  "min_delete_depth": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_dav_module.html#min_delete_depth"
+    ]
+  },
+  "mirror": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mirror_module.html#mirror"
+    ]
+  },
+  "mirror_request_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mirror_module.html#mirror_request_body"
+    ]
+  },
+  "modern_browser": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_browser_module.html#modern_browser"
+    ]
+  },
+  "modern_browser_value": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_browser_module.html#modern_browser_value"
+    ]
+  },
+  "mp4": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mp4_module.html#mp4"
+    ]
+  },
+  "mp4_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mp4_module.html#mp4_buffer_size"
+    ]
+  },
+  "mp4_limit_rate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mp4_module.html#mp4_limit_rate"
+    ]
+  },
+  "mp4_limit_rate_after": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mp4_module.html#mp4_limit_rate_after"
+    ]
+  },
+  "mp4_max_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mp4_module.html#mp4_max_buffer_size"
+    ]
+  },
+  "mp4_start_key_frame": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_mp4_module.html#mp4_start_key_frame"
+    ]
+  },
+  "mqtt": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_mqtt_filter_module.html#mqtt"
+    ]
+  },
+  "mqtt_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_mqtt_filter_module.html#mqtt_buffers"
+    ]
+  },
+  "mqtt_preread": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_mqtt_preread_module.html#mqtt_preread"
+    ]
+  },
+  "mqtt_rewrite_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_mqtt_filter_module.html#mqtt_rewrite_buffer_size"
+    ]
+  },
+  "mqtt_set_connect": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_mqtt_filter_module.html#mqtt_set_connect"
+    ]
+  },
+  "msie_padding": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#msie_padding"
+    ]
+  },
+  "msie_refresh": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#msie_refresh"
+    ]
+  },
+  "multi_accept": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#multi_accept"
+    ]
+  },
+  "ntlm": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#ntlm"
+    ]
+  },
+  "open_file_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache"
+    ]
+  },
+  "open_file_cache_errors": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache_errors"
+    ]
+  },
+  "open_file_cache_min_uses": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache_min_uses"
+    ]
+  },
+  "open_file_cache_valid": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache_valid"
+    ]
+  },
+  "open_log_file_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_log_module.html#open_log_file_cache",
+      "https://nginx.org/en/docs/stream/ngx_stream_log_module.html#open_log_file_cache"
+    ]
+  },
+  "otel_exporter": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_otel_module.html#otel_exporter"
+    ]
+  },
+  "otel_service_name": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_otel_module.html#otel_service_name"
+    ]
+  },
+  "otel_span_attr": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_otel_module.html#otel_span_attr"
+    ]
+  },
+  "otel_span_name": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_otel_module.html#otel_span_name"
+    ]
+  },
+  "otel_trace": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_otel_module.html#otel_trace"
+    ]
+  },
+  "otel_trace_context": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_otel_module.html#otel_trace_context"
+    ]
+  },
+  "output_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#output_buffers"
+    ]
+  },
+  "override_charset": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_charset_module.html#override_charset"
+    ]
+  },
+  "pass": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_pass_module.html#pass"
+    ]
+  },
+  "pcre_jit": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#pcre_jit"
+    ]
+  },
+  "perl": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_perl_module.html#perl"
+    ]
+  },
+  "perl_modules": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_perl_module.html#perl_modules"
+    ]
+  },
+  "perl_require": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_perl_module.html#perl_require"
+    ]
+  },
+  "perl_set": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_perl_module.html#perl_set"
+    ]
+  },
+  "pid": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#pid"
+    ]
+  },
+  "pop3_auth": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_pop3_module.html#pop3_auth"
+    ]
+  },
+  "pop3_capabilities": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_pop3_module.html#pop3_capabilities"
+    ]
+  },
+  "port_in_redirect": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect"
+    ]
+  },
+  "postpone_output": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#postpone_output"
+    ]
+  },
+  "preread_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#preread_buffer_size"
+    ]
+  },
+  "preread_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#preread_timeout"
+    ]
+  },
+  "protocol": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#protocol"
+    ]
+  },
+  "proxy_bind": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_bind",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_bind"
+    ]
+  },
+  "proxy_buffer": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_proxy_module.html#proxy_buffer"
+    ]
+  },
+  "proxy_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_buffer_size"
+    ]
+  },
+  "proxy_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering"
+    ]
+  },
+  "proxy_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers"
+    ]
+  },
+  "proxy_busy_buffers_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size"
+    ]
+  },
+  "proxy_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache"
+    ]
+  },
+  "proxy_cache_background_update": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_background_update"
+    ]
+  },
+  "proxy_cache_bypass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_bypass"
+    ]
+  },
+  "proxy_cache_convert_head": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_convert_head"
+    ]
+  },
+  "proxy_cache_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_key"
+    ]
+  },
+  "proxy_cache_lock": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock"
+    ]
+  },
+  "proxy_cache_lock_age": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock_age"
+    ]
+  },
+  "proxy_cache_lock_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock_timeout"
+    ]
+  },
+  "proxy_cache_max_range_offset": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_max_range_offset"
+    ]
+  },
+  "proxy_cache_methods": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_methods"
+    ]
+  },
+  "proxy_cache_min_uses": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_min_uses"
+    ]
+  },
+  "proxy_cache_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path"
+    ]
+  },
+  "proxy_cache_purge": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_purge"
+    ]
+  },
+  "proxy_cache_revalidate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_revalidate"
+    ]
+  },
+  "proxy_cache_use_stale": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale"
+    ]
+  },
+  "proxy_cache_valid": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid"
+    ]
+  },
+  "proxy_connect_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_connect_timeout"
+    ]
+  },
+  "proxy_cookie_domain": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain"
+    ]
+  },
+  "proxy_cookie_flags": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_flags"
+    ]
+  },
+  "proxy_cookie_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_path"
+    ]
+  },
+  "proxy_download_rate": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_download_rate"
+    ]
+  },
+  "proxy_force_ranges": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_force_ranges"
+    ]
+  },
+  "proxy_half_close": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_half_close"
+    ]
+  },
+  "proxy_headers_hash_bucket_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_bucket_size"
+    ]
+  },
+  "proxy_headers_hash_max_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_max_size"
+    ]
+  },
+  "proxy_hide_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_hide_header"
+    ]
+  },
+  "proxy_http_version": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version"
+    ]
+  },
+  "proxy_ignore_client_abort": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort"
+    ]
+  },
+  "proxy_ignore_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers"
+    ]
+  },
+  "proxy_intercept_errors": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors"
+    ]
+  },
+  "proxy_limit_rate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_limit_rate"
+    ]
+  },
+  "proxy_max_temp_file_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size"
+    ]
+  },
+  "proxy_method": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method"
+    ]
+  },
+  "proxy_next_upstream": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_next_upstream"
+    ]
+  },
+  "proxy_next_upstream_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream_timeout",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_next_upstream_timeout"
+    ]
+  },
+  "proxy_next_upstream_tries": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream_tries",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_next_upstream_tries"
+    ]
+  },
+  "proxy_no_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_no_cache"
+    ]
+  },
+  "proxy_pass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_pass"
+    ]
+  },
+  "proxy_pass_error_message": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_proxy_module.html#proxy_pass_error_message"
+    ]
+  },
+  "proxy_pass_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_header"
+    ]
+  },
+  "proxy_pass_request_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_request_body"
+    ]
+  },
+  "proxy_pass_request_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_request_headers"
+    ]
+  },
+  "proxy_pass_trailers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_trailers"
+    ]
+  },
+  "proxy_protocol": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_proxy_module.html#proxy_protocol",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_protocol"
+    ]
+  },
+  "proxy_protocol_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#proxy_protocol_timeout"
+    ]
+  },
+  "proxy_read_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout"
+    ]
+  },
+  "proxy_redirect": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect"
+    ]
+  },
+  "proxy_request_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering"
+    ]
+  },
+  "proxy_requests": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_requests"
+    ]
+  },
+  "proxy_responses": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_responses"
+    ]
+  },
+  "proxy_send_lowat": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_lowat"
+    ]
+  },
+  "proxy_send_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout"
+    ]
+  },
+  "proxy_session_drop": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_session_drop"
+    ]
+  },
+  "proxy_set_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_body"
+    ]
+  },
+  "proxy_set_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header"
+    ]
+  },
+  "proxy_smtp_auth": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_proxy_module.html#proxy_smtp_auth"
+    ]
+  },
+  "proxy_socket_keepalive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_socket_keepalive",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_socket_keepalive"
+    ]
+  },
+  "proxy_ssl": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl"
+    ]
+  },
+  "proxy_ssl_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_certificate"
+    ]
+  },
+  "proxy_ssl_certificate_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate_key",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_certificate_key"
+    ]
+  },
+  "proxy_ssl_ciphers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_ciphers",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_ciphers"
+    ]
+  },
+  "proxy_ssl_conf_command": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_conf_command",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_conf_command"
+    ]
+  },
+  "proxy_ssl_crl": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_crl",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_crl"
+    ]
+  },
+  "proxy_ssl_key_log": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_key_log",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_key_log"
+    ]
+  },
+  "proxy_ssl_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_name",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_name"
+    ]
+  },
+  "proxy_ssl_password_file": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_password_file",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_password_file"
+    ]
+  },
+  "proxy_ssl_protocols": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_protocols",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_protocols"
+    ]
+  },
+  "proxy_ssl_server_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_server_name"
+    ]
+  },
+  "proxy_ssl_session_reuse": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_session_reuse",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_session_reuse"
+    ]
+  },
+  "proxy_ssl_trusted_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_trusted_certificate",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_trusted_certificate"
+    ]
+  },
+  "proxy_ssl_verify": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_verify"
+    ]
+  },
+  "proxy_ssl_verify_depth": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify_depth",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_ssl_verify_depth"
+    ]
+  },
+  "proxy_store": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_store"
+    ]
+  },
+  "proxy_store_access": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_store_access"
+    ]
+  },
+  "proxy_temp_file_write_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size"
+    ]
+  },
+  "proxy_temp_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_path"
+    ]
+  },
+  "proxy_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_proxy_module.html#proxy_timeout",
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_timeout"
+    ]
+  },
+  "proxy_upload_rate": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_upload_rate"
+    ]
+  },
+  "queue": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#queue"
+    ]
+  },
+  "quic_active_connection_id_limit": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#quic_active_connection_id_limit"
+    ]
+  },
+  "quic_bpf": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#quic_bpf"
+    ]
+  },
+  "quic_gso": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#quic_gso"
+    ]
+  },
+  "quic_host_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#quic_host_key"
+    ]
+  },
+  "quic_retry": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_v3_module.html#quic_retry"
+    ]
+  },
+  "random": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#random",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#random"
+    ]
+  },
+  "random_index": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_random_index_module.html#random_index"
+    ]
+  },
+  "read_ahead": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#read_ahead"
+    ]
+  },
+  "real_ip_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_realip_module.html#real_ip_header"
+    ]
+  },
+  "real_ip_recursive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_realip_module.html#real_ip_recursive"
+    ]
+  },
+  "recursive_error_pages": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#recursive_error_pages"
+    ]
+  },
+  "referer_hash_bucket_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_referer_module.html#referer_hash_bucket_size"
+    ]
+  },
+  "referer_hash_max_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_referer_module.html#referer_hash_max_size"
+    ]
+  },
+  "request_pool_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#request_pool_size"
+    ]
+  },
+  "reset_timedout_connection": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#reset_timedout_connection"
+    ]
+  },
+  "resolver": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#resolver",
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#resolver",
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#resolver",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#resolver",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#resolver",
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#resolver"
+    ]
+  },
+  "resolver_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout",
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#resolver_timeout",
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#resolver_timeout",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#resolver_timeout",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#resolver_timeout"
+    ]
+  },
+  "return": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return",
+      "https://nginx.org/en/docs/stream/ngx_stream_return_module.html#return"
+    ]
+  },
+  "rewrite": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite"
+    ]
+  },
+  "rewrite_log": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite_log"
+    ]
+  },
+  "root": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#root"
+    ]
+  },
+  "satisfy": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#satisfy"
+    ]
+  },
+  "scgi_bind": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_bind"
+    ]
+  },
+  "scgi_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_buffer_size"
+    ]
+  },
+  "scgi_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_buffering"
+    ]
+  },
+  "scgi_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_buffers"
+    ]
+  },
+  "scgi_busy_buffers_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_busy_buffers_size"
+    ]
+  },
+  "scgi_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache"
+    ]
+  },
+  "scgi_cache_background_update": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_background_update"
+    ]
+  },
+  "scgi_cache_bypass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_bypass"
+    ]
+  },
+  "scgi_cache_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_key"
+    ]
+  },
+  "scgi_cache_lock": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_lock"
+    ]
+  },
+  "scgi_cache_lock_age": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_lock_age"
+    ]
+  },
+  "scgi_cache_lock_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_lock_timeout"
+    ]
+  },
+  "scgi_cache_max_range_offset": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_max_range_offset"
+    ]
+  },
+  "scgi_cache_methods": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_methods"
+    ]
+  },
+  "scgi_cache_min_uses": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_min_uses"
+    ]
+  },
+  "scgi_cache_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_path"
+    ]
+  },
+  "scgi_cache_purge": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_purge"
+    ]
+  },
+  "scgi_cache_revalidate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_revalidate"
+    ]
+  },
+  "scgi_cache_use_stale": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_use_stale"
+    ]
+  },
+  "scgi_cache_valid": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_cache_valid"
+    ]
+  },
+  "scgi_connect_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_connect_timeout"
+    ]
+  },
+  "scgi_force_ranges": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_force_ranges"
+    ]
+  },
+  "scgi_hide_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_hide_header"
+    ]
+  },
+  "scgi_ignore_client_abort": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_ignore_client_abort"
+    ]
+  },
+  "scgi_ignore_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_ignore_headers"
+    ]
+  },
+  "scgi_intercept_errors": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_intercept_errors"
+    ]
+  },
+  "scgi_limit_rate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_limit_rate"
+    ]
+  },
+  "scgi_max_temp_file_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_max_temp_file_size"
+    ]
+  },
+  "scgi_next_upstream": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_next_upstream"
+    ]
+  },
+  "scgi_next_upstream_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_next_upstream_timeout"
+    ]
+  },
+  "scgi_next_upstream_tries": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_next_upstream_tries"
+    ]
+  },
+  "scgi_no_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_no_cache"
+    ]
+  },
+  "scgi_param": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_param"
+    ]
+  },
+  "scgi_pass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_pass"
+    ]
+  },
+  "scgi_pass_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_pass_header"
+    ]
+  },
+  "scgi_pass_request_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_pass_request_body"
+    ]
+  },
+  "scgi_pass_request_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_pass_request_headers"
+    ]
+  },
+  "scgi_read_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_read_timeout"
+    ]
+  },
+  "scgi_request_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_request_buffering"
+    ]
+  },
+  "scgi_send_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_send_timeout"
+    ]
+  },
+  "scgi_socket_keepalive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_socket_keepalive"
+    ]
+  },
+  "scgi_store": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_store"
+    ]
+  },
+  "scgi_store_access": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_store_access"
+    ]
+  },
+  "scgi_temp_file_write_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_temp_file_write_size"
+    ]
+  },
+  "scgi_temp_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_temp_path"
+    ]
+  },
+  "secure_link": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_secure_link_module.html#secure_link"
+    ]
+  },
+  "secure_link_md5": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_secure_link_module.html#secure_link_md5"
+    ]
+  },
+  "secure_link_secret": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_secure_link_module.html#secure_link_secret"
+    ]
+  },
+  "send_lowat": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#send_lowat"
+    ]
+  },
+  "send_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout"
+    ]
+  },
+  "sendfile": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile"
+    ]
+  },
+  "sendfile_max_chunk": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile_max_chunk"
+    ]
+  },
+  "server": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#server",
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server",
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#server",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#server",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#server"
+    ]
+  },
+  "server_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name",
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#server_name",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#server_name"
+    ]
+  },
+  "server_name_in_redirect": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name_in_redirect"
+    ]
+  },
+  "server_names_hash_bucket_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#server_names_hash_bucket_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#server_names_hash_bucket_size"
+    ]
+  },
+  "server_names_hash_max_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#server_names_hash_max_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#server_names_hash_max_size"
+    ]
+  },
+  "server_tokens": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens"
+    ]
+  },
+  "session_log": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_session_log_module.html#session_log"
+    ]
+  },
+  "session_log_format": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_session_log_module.html#session_log_format"
+    ]
+  },
+  "session_log_zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_session_log_module.html#session_log_zone"
+    ]
+  },
+  "set": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#set",
+      "https://nginx.org/en/docs/stream/ngx_stream_set_module.html#set"
+    ]
+  },
+  "set_real_ip_from": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_realip_module.html#set_real_ip_from",
+      "https://nginx.org/en/docs/mail/ngx_mail_realip_module.html#set_real_ip_from",
+      "https://nginx.org/en/docs/stream/ngx_stream_realip_module.html#set_real_ip_from"
+    ]
+  },
+  "slice": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_slice_module.html#slice"
+    ]
+  },
+  "smtp_auth": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_smtp_module.html#smtp_auth"
+    ]
+  },
+  "smtp_capabilities": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_smtp_module.html#smtp_capabilities"
+    ]
+  },
+  "smtp_client_buffer": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_smtp_module.html#smtp_client_buffer"
+    ]
+  },
+  "smtp_greeting_delay": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_smtp_module.html#smtp_greeting_delay"
+    ]
+  },
+  "source_charset": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_charset_module.html#source_charset"
+    ]
+  },
+  "split_clients": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_split_clients_module.html#split_clients",
+      "https://nginx.org/en/docs/stream/ngx_stream_split_clients_module.html#split_clients"
+    ]
+  },
+  "ssi": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssi_module.html#ssi"
+    ]
+  },
+  "ssi_last_modified": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssi_module.html#ssi_last_modified"
+    ]
+  },
+  "ssi_min_file_chunk": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssi_module.html#ssi_min_file_chunk"
+    ]
+  },
+  "ssi_silent_errors": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssi_module.html#ssi_silent_errors"
+    ]
+  },
+  "ssi_types": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssi_module.html#ssi_types"
+    ]
+  },
+  "ssi_value_length": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssi_module.html#ssi_value_length"
+    ]
+  },
+  "ssl": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl"
+    ]
+  },
+  "ssl_alpn": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_alpn"
+    ]
+  },
+  "ssl_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_buffer_size"
+    ]
+  },
+  "ssl_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_certificate",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_certificate"
+    ]
+  },
+  "ssl_certificate_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate_key",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_certificate_key",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_certificate_key"
+    ]
+  },
+  "ssl_ciphers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_ciphers",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_ciphers"
+    ]
+  },
+  "ssl_client_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_client_certificate",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_client_certificate"
+    ]
+  },
+  "ssl_conf_command": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_conf_command",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_conf_command",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_conf_command"
+    ]
+  },
+  "ssl_crl": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_crl",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_crl",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_crl",
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#ssl_crl"
+    ]
+  },
+  "ssl_dhparam": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_dhparam",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_dhparam"
+    ]
+  },
+  "ssl_early_data": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data"
+    ]
+  },
+  "ssl_ecdh_curve": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ecdh_curve",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_ecdh_curve",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_ecdh_curve"
+    ]
+  },
+  "ssl_engine": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#ssl_engine"
+    ]
+  },
+  "ssl_handshake_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_handshake_timeout"
+    ]
+  },
+  "ssl_key_log": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_key_log",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_key_log"
+    ]
+  },
+  "ssl_ocsp": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ocsp",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_ocsp"
+    ]
+  },
+  "ssl_ocsp_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ocsp_cache",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_ocsp_cache"
+    ]
+  },
+  "ssl_ocsp_responder": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ocsp_responder",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_ocsp_responder"
+    ]
+  },
+  "ssl_password_file": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_password_file",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_password_file",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_password_file"
+    ]
+  },
+  "ssl_prefer_server_ciphers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_prefer_server_ciphers",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_prefer_server_ciphers",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_prefer_server_ciphers"
+    ]
+  },
+  "ssl_preread": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html#ssl_preread"
+    ]
+  },
+  "ssl_protocols": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_protocols",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_protocols"
+    ]
+  },
+  "ssl_reject_handshake": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_reject_handshake",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_reject_handshake"
+    ]
+  },
+  "ssl_session_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_session_cache",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_session_cache"
+    ]
+  },
+  "ssl_session_ticket_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_ticket_key",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_session_ticket_key",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_session_ticket_key"
+    ]
+  },
+  "ssl_session_tickets": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_tickets",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_session_tickets",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_session_tickets"
+    ]
+  },
+  "ssl_session_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_timeout",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_session_timeout",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_session_timeout"
+    ]
+  },
+  "ssl_stapling": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_stapling"
+    ]
+  },
+  "ssl_stapling_file": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling_file",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_stapling_file"
+    ]
+  },
+  "ssl_stapling_responder": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling_responder",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_stapling_responder"
+    ]
+  },
+  "ssl_stapling_verify": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling_verify",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_stapling_verify"
+    ]
+  },
+  "ssl_trusted_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_trusted_certificate",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_trusted_certificate",
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#ssl_trusted_certificate"
+    ]
+  },
+  "ssl_verify": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#ssl_verify"
+    ]
+  },
+  "ssl_verify_client": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_verify_client",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_verify_client",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_verify_client"
+    ]
+  },
+  "ssl_verify_depth": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_verify_depth",
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#ssl_verify_depth",
+      "https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html#ssl_verify_depth"
+    ]
+  },
+  "starttls": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html#starttls"
+    ]
+  },
+  "state": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#state",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#state"
+    ]
+  },
+  "state_path": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#state_path"
+    ]
+  },
+  "status": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_status_module.html#status"
+    ]
+  },
+  "status_format": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_status_module.html#status_format"
+    ]
+  },
+  "status_zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_api_module.html#status_zone",
+      "https://nginx.org/en/docs/http/ngx_http_status_module.html#status_zone"
+    ]
+  },
+  "sticky": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky"
+    ]
+  },
+  "sticky_cookie_insert": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky_cookie_insert"
+    ]
+  },
+  "stream": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#stream"
+    ]
+  },
+  "stub_status": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_stub_status_module.html#stub_status"
+    ]
+  },
+  "sub_filter": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_sub_module.html#sub_filter"
+    ]
+  },
+  "sub_filter_last_modified": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_sub_module.html#sub_filter_last_modified"
+    ]
+  },
+  "sub_filter_once": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_sub_module.html#sub_filter_once"
+    ]
+  },
+  "sub_filter_types": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_sub_module.html#sub_filter_types"
+    ]
+  },
+  "subrequest_output_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#subrequest_output_buffer_size"
+    ]
+  },
+  "tcp_nodelay": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nodelay",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#tcp_nodelay"
+    ]
+  },
+  "tcp_nopush": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nopush"
+    ]
+  },
+  "thread_pool": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#thread_pool"
+    ]
+  },
+  "timeout": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_core_module.html#timeout"
+    ]
+  },
+  "timer_resolution": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#timer_resolution"
+    ]
+  },
+  "try_files": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#try_files"
+    ]
+  },
+  "types": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#types"
+    ]
+  },
+  "types_hash_bucket_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#types_hash_bucket_size"
+    ]
+  },
+  "types_hash_max_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#types_hash_max_size"
+    ]
+  },
+  "underscores_in_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers"
+    ]
+  },
+  "uninitialized_variable_warn": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#uninitialized_variable_warn"
+    ]
+  },
+  "upstream": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#upstream"
+    ]
+  },
+  "upstream_conf": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_conf_module.html#upstream_conf"
+    ]
+  },
+  "usage_report": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_mgmt_module.html#usage_report"
+    ]
+  },
+  "use": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#use"
+    ]
+  },
+  "user": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#user"
+    ]
+  },
+  "userid": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid"
+    ]
+  },
+  "userid_domain": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_domain"
+    ]
+  },
+  "userid_expires": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_expires"
+    ]
+  },
+  "userid_flags": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_flags"
+    ]
+  },
+  "userid_mark": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_mark"
+    ]
+  },
+  "userid_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_name"
+    ]
+  },
+  "userid_p3p": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_p3p"
+    ]
+  },
+  "userid_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_path"
+    ]
+  },
+  "userid_service": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_userid_module.html#userid_service"
+    ]
+  },
+  "uwsgi_bind": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_bind"
+    ]
+  },
+  "uwsgi_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_buffer_size"
+    ]
+  },
+  "uwsgi_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_buffering"
+    ]
+  },
+  "uwsgi_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_buffers"
+    ]
+  },
+  "uwsgi_busy_buffers_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_busy_buffers_size"
+    ]
+  },
+  "uwsgi_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache"
+    ]
+  },
+  "uwsgi_cache_background_update": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_background_update"
+    ]
+  },
+  "uwsgi_cache_bypass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_bypass"
+    ]
+  },
+  "uwsgi_cache_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_key"
+    ]
+  },
+  "uwsgi_cache_lock": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_lock"
+    ]
+  },
+  "uwsgi_cache_lock_age": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_lock_age"
+    ]
+  },
+  "uwsgi_cache_lock_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_lock_timeout"
+    ]
+  },
+  "uwsgi_cache_max_range_offset": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_max_range_offset"
+    ]
+  },
+  "uwsgi_cache_methods": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_methods"
+    ]
+  },
+  "uwsgi_cache_min_uses": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_min_uses"
+    ]
+  },
+  "uwsgi_cache_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_path"
+    ]
+  },
+  "uwsgi_cache_purge": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_purge"
+    ]
+  },
+  "uwsgi_cache_revalidate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_revalidate"
+    ]
+  },
+  "uwsgi_cache_use_stale": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_use_stale"
+    ]
+  },
+  "uwsgi_cache_valid": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_cache_valid"
+    ]
+  },
+  "uwsgi_connect_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_connect_timeout"
+    ]
+  },
+  "uwsgi_force_ranges": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_force_ranges"
+    ]
+  },
+  "uwsgi_hide_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_hide_header"
+    ]
+  },
+  "uwsgi_ignore_client_abort": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ignore_client_abort"
+    ]
+  },
+  "uwsgi_ignore_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ignore_headers"
+    ]
+  },
+  "uwsgi_intercept_errors": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_intercept_errors"
+    ]
+  },
+  "uwsgi_limit_rate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_limit_rate"
+    ]
+  },
+  "uwsgi_max_temp_file_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_max_temp_file_size"
+    ]
+  },
+  "uwsgi_modifier1": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_modifier1"
+    ]
+  },
+  "uwsgi_modifier2": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_modifier2"
+    ]
+  },
+  "uwsgi_next_upstream": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_next_upstream"
+    ]
+  },
+  "uwsgi_next_upstream_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_next_upstream_timeout"
+    ]
+  },
+  "uwsgi_next_upstream_tries": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_next_upstream_tries"
+    ]
+  },
+  "uwsgi_no_cache": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_no_cache"
+    ]
+  },
+  "uwsgi_param": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_param"
+    ]
+  },
+  "uwsgi_pass": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_pass"
+    ]
+  },
+  "uwsgi_pass_header": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_pass_header"
+    ]
+  },
+  "uwsgi_pass_request_body": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_pass_request_body"
+    ]
+  },
+  "uwsgi_pass_request_headers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_pass_request_headers"
+    ]
+  },
+  "uwsgi_read_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_read_timeout"
+    ]
+  },
+  "uwsgi_request_buffering": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_request_buffering"
+    ]
+  },
+  "uwsgi_send_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_send_timeout"
+    ]
+  },
+  "uwsgi_socket_keepalive": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_socket_keepalive"
+    ]
+  },
+  "uwsgi_ssl_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_certificate"
+    ]
+  },
+  "uwsgi_ssl_certificate_key": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_certificate_key"
+    ]
+  },
+  "uwsgi_ssl_ciphers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_ciphers"
+    ]
+  },
+  "uwsgi_ssl_conf_command": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_conf_command"
+    ]
+  },
+  "uwsgi_ssl_crl": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_crl"
+    ]
+  },
+  "uwsgi_ssl_key_log": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_key_log"
+    ]
+  },
+  "uwsgi_ssl_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_name"
+    ]
+  },
+  "uwsgi_ssl_password_file": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_password_file"
+    ]
+  },
+  "uwsgi_ssl_protocols": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_protocols"
+    ]
+  },
+  "uwsgi_ssl_server_name": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_server_name"
+    ]
+  },
+  "uwsgi_ssl_session_reuse": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_session_reuse"
+    ]
+  },
+  "uwsgi_ssl_trusted_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_trusted_certificate"
+    ]
+  },
+  "uwsgi_ssl_verify": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_verify"
+    ]
+  },
+  "uwsgi_ssl_verify_depth": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_ssl_verify_depth"
+    ]
+  },
+  "uwsgi_store": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_store"
+    ]
+  },
+  "uwsgi_store_access": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_store_access"
+    ]
+  },
+  "uwsgi_temp_file_write_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_temp_file_write_size"
+    ]
+  },
+  "uwsgi_temp_path": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_temp_path"
+    ]
+  },
+  "valid_referers": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers"
+    ]
+  },
+  "variables_hash_bucket_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#variables_hash_bucket_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#variables_hash_bucket_size"
+    ]
+  },
+  "variables_hash_max_size": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_core_module.html#variables_hash_max_size",
+      "https://nginx.org/en/docs/stream/ngx_stream_core_module.html#variables_hash_max_size"
+    ]
+  },
+  "worker_aio_requests": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_aio_requests"
+    ]
+  },
+  "worker_connections": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_connections"
+    ]
+  },
+  "worker_cpu_affinity": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity"
+    ]
+  },
+  "worker_priority": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_priority"
+    ]
+  },
+  "worker_processes": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_processes"
+    ]
+  },
+  "worker_rlimit_core": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_core"
+    ]
+  },
+  "worker_rlimit_nofile": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile"
+    ]
+  },
+  "worker_shutdown_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#worker_shutdown_timeout"
+    ]
+  },
+  "working_directory": {
+    "links": [
+      "https://nginx.org/en/docs/ngx_core_module.html#working_directory"
+    ]
+  },
+  "xclient": {
+    "links": [
+      "https://nginx.org/en/docs/mail/ngx_mail_proxy_module.html#xclient"
+    ]
+  },
+  "xml_entities": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_xslt_module.html#xml_entities"
+    ]
+  },
+  "xslt_last_modified": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_xslt_module.html#xslt_last_modified"
+    ]
+  },
+  "xslt_param": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_xslt_module.html#xslt_param"
+    ]
+  },
+  "xslt_string_param": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_xslt_module.html#xslt_string_param"
+    ]
+  },
+  "xslt_stylesheet": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_xslt_module.html#xslt_stylesheet"
+    ]
+  },
+  "xslt_types": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_xslt_module.html#xslt_types"
+    ]
+  },
+  "zone": {
+    "links": [
+      "https://nginx.org/en/docs/http/ngx_http_upstream_module.html#zone",
+      "https://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#zone"
+    ]
+  },
+  "zone_sync": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync"
+    ]
+  },
+  "zone_sync_buffers": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_buffers"
+    ]
+  },
+  "zone_sync_connect_retry_interval": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_connect_retry_interval"
+    ]
+  },
+  "zone_sync_connect_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_connect_timeout"
+    ]
+  },
+  "zone_sync_interval": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_interval"
+    ]
+  },
+  "zone_sync_recv_buffer_size": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_recv_buffer_size"
+    ]
+  },
+  "zone_sync_server": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_server"
+    ]
+  },
+  "zone_sync_ssl": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl"
+    ]
+  },
+  "zone_sync_ssl_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_certificate"
+    ]
+  },
+  "zone_sync_ssl_certificate_key": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_certificate_key"
+    ]
+  },
+  "zone_sync_ssl_ciphers": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_ciphers"
+    ]
+  },
+  "zone_sync_ssl_conf_command": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_conf_command"
+    ]
+  },
+  "zone_sync_ssl_crl": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_crl"
+    ]
+  },
+  "zone_sync_ssl_name": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_name"
+    ]
+  },
+  "zone_sync_ssl_password_file": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_password_file"
+    ]
+  },
+  "zone_sync_ssl_protocols": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_protocols"
+    ]
+  },
+  "zone_sync_ssl_server_name": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_server_name"
+    ]
+  },
+  "zone_sync_ssl_trusted_certificate": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_trusted_certificate"
+    ]
+  },
+  "zone_sync_ssl_verify": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_verify"
+    ]
+  },
+  "zone_sync_ssl_verify_depth": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_ssl_verify_depth"
+    ]
+  },
+  "zone_sync_timeout": {
+    "links": [
+      "https://nginx.org/en/docs/stream/ngx_stream_zone_sync_module.html#zone_sync_timeout"
+    ]
+  }
+}