Add seach engine optimization
This commit is contained in:
1 parent
b8b3a71e21
commit
08daceab47
4 files changed
+58
-3
No files matched your search
@@ -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
@@ -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() {
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://kyduyen.duckdns.org/sitemap.xml
|
||||
@@ -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>
|
||||
Reference in new issue
Block a user