Add seach engine optimization

This commit is contained in:
Quang Khai Nguyen committed 2026-10-12 14:22:01 +02:00
1 parent b8b3a71e21
commit 08daceab47
4 files changed
+58 -3

No files matched your search

+1
View File
@@ -8,6 +8,7 @@ COPY nginx.conf /etc/nginx/conf.d/default.conf
# Copy source code web và thư mục ảnh vào
COPY index.html /usr/share/nginx/html/
COPY robots.txt sitemap.xml /usr/share/nginx/html/
COPY images/ /usr/share/nginx/html/images/
EXPOSE 80
+47 -3
View File
@@ -4,6 +4,23 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title data-i18n="page_title">Nha Trang — Thiên đường du lịch biển Việt Nam | 芽庄 | Nha Trang | Нячанг</title>
<meta name="description" content="Khám phá Nha Trang: các điểm tham quan nổi bật, thời tiết theo mùa, ẩm thực địa phương và tour du lịch.">
<link rel="canonical" href="https://kyduyen.duckdns.org/">
<meta property="og:type" content="website">
<meta property="og:title" content="Nha Trang — Cẩm nang du lịch">
<meta property="og:description" content="Khám phá điểm đến, thời tiết, ẩm thực và trải nghiệm tại Nha Trang, Việt Nam.">
<meta property="og:url" content="https://kyduyen.duckdns.org/">
<meta property="og:locale" content="vi_VN">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Nha Trang Travel Guide",
"url": "https://kyduyen.duckdns.org/",
"description": "A travel guide to attractions, seasonal weather, cuisine, and tours in Nha Trang, Vietnam.",
"inLanguage": ["vi", "ru", "en", "zh", "de", "fr"]
}
</script>
<!-- Tailwind CSS CDN -->
<script src="https://cdn.tailwindcss.com"></script>
<!-- FontAwesome Icons -->
@@ -332,7 +349,7 @@
<p class="text-brand-100 text-lg" data-i18n="book_desc">Hãy để chúng tôi giúp bạn lên kế hoạch cho chuyến đi hoàn hảo nhất.</p>
</div>
<form onsubmit="handleBooking(event)" class="bg-white text-gray-800 p-8 sm:p-12 rounded-3xl shadow-2xl space-y-6">
<form action="https://formspree.io/f/YOUR_FORM_ID" method="POST" onsubmit="handleBooking(event)" class="bg-white text-gray-800 p-8 sm:p-12 rounded-3xl shadow-2xl space-y-6">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-6">
<div>
<label for="booking-name" class="block text-sm font-bold text-gray-700 mb-2" data-i18n="form_name">Họ và tên</label>
@@ -367,6 +384,7 @@
<button type="submit" class="w-full py-4 bg-brand-500 hover:bg-brand-600 text-white font-bold rounded-xl shadow-lg shadow-brand-500/30 transition text-lg" data-i18n="form_submit">
Gửi yêu cầu đặt tour
</button>
<p id="form-status" role="alert" class="hidden text-sm text-red-600" data-i18n="form_error"></p>
</form>
</div>
</section>
@@ -476,6 +494,7 @@
pkg_3: "Nghỉ dưỡng & Tắm bùn khoáng",
form_notes: "Yêu cầu đặc biệt",
form_submit: "Gửi yêu cầu đặt tour",
form_error: "Không thể gửi yêu cầu lúc này. Vui lòng thử lại sau.",
footer_copy: "© 2026 Nha Trang Travel Guide. All rights reserved.",
modal_title: "Thành công!",
modal_desc: "Yêu cầu của bạn đã được gửi. Chúng tôi sẽ liên hệ lại sớm nhất.",
@@ -552,6 +571,7 @@
pkg_3: "Спа-отдых & Термальные источники",
form_notes: "Пожелания / Заметки",
form_submit: "Отправить заявку",
form_error: "Не удалось отправить заявку. Пожалуйста, попробуйте позже.",
footer_copy: "© 2026 Nha Trang Travel Guide. Все права защищены.",
modal_title: "Успешно!",
modal_desc: "Ваша заявка отправлена. Мы свяжемся с вами в ближайшее время.",
@@ -628,6 +648,7 @@
pkg_3: "Wellness Spa & Mineral Mud Baths",
form_notes: "Special Requests",
form_submit: "Submit Request",
form_error: "Your request could not be sent. Please try again later.",
footer_copy: "© 2026 Nha Trang Travel Guide. All rights reserved.",
modal_title: "Success!",
modal_desc: "Your booking request has been sent. We will contact you shortly.",
@@ -704,6 +725,7 @@
pkg_3: "温泉泥浴 & 养生SPA",
form_notes: "特殊需求 / 备注",
form_submit: "提交预订申请",
form_error: "暂时无法发送您的请求,请稍后重试。",
footer_copy: "© 2026 Nha Trang Travel Guide. 保留所有权利。",
modal_title: "提交成功!",
modal_desc: "您的预订申请已成功发送,我们将尽快与您联系。",
@@ -780,6 +802,7 @@
pkg_3: "Wellness und Mineral-Schlammbäder",
form_notes: "Besondere Wünsche",
form_submit: "Anfrage senden",
form_error: "Ihre Anfrage konnte nicht gesendet werden. Bitte versuchen Sie es später erneut.",
footer_copy: "© 2026 Nha Trang Travel Guide. Alle Rechte vorbehalten.",
modal_title: "Erfolgreich!",
modal_desc: "Ihre Anfrage wurde gesendet. Wir melden uns in Kürze bei Ihnen.",
@@ -856,6 +879,7 @@
pkg_3: "Spa et bains de boue minérale",
form_notes: "Demandes particulières",
form_submit: "Envoyer la demande",
form_error: "Votre demande n'a pas pu être envoyée. Veuillez réessayer plus tard.",
footer_copy: "© 2026 Nha Trang Travel Guide. Tous droits réservés.",
modal_title: "Demande envoyée !",
modal_desc: "Votre demande a bien été envoyée. Nous vous contacterons bientôt.",
@@ -911,9 +935,29 @@
});
}
function handleBooking(event) {
async function handleBooking(event) {
event.preventDefault();
document.getElementById('success-modal').classList.remove('hidden');
const form = event.currentTarget;
const submitButton = form.querySelector('[type="submit"]');
const status = document.getElementById('form-status');
status.classList.add('hidden');
submitButton.disabled = true;
try {
const response = await fetch(form.action, {
method: form.method,
body: new FormData(form),
headers: { Accept: 'application/json' }
});
if (!response.ok) throw new Error('Form submission failed');
form.reset();
document.getElementById('success-modal').classList.remove('hidden');
} catch {
status.classList.remove('hidden');
} finally {
submitButton.disabled = false;
}
}
function closeModal() {
+4
View File
@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: https://kyduyen.duckdns.org/sitemap.xml
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://kyduyen.duckdns.org/</loc>
</url>
</urlset>