Add seach engine optimization
This commit is contained in:
1 parent
b8b3a71e21
commit
08daceab47
4 files changed
+57
-2
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 source code web và thư mục ảnh vào
|
||||||
COPY index.html /usr/share/nginx/html/
|
COPY index.html /usr/share/nginx/html/
|
||||||
|
COPY robots.txt sitemap.xml /usr/share/nginx/html/
|
||||||
COPY images/ /usr/share/nginx/html/images/
|
COPY images/ /usr/share/nginx/html/images/
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|||||||
+46
-2
@@ -4,6 +4,23 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<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>
|
<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 -->
|
<!-- Tailwind CSS CDN -->
|
||||||
<script src="https://cdn.tailwindcss.com"></script>
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
<!-- FontAwesome Icons -->
|
<!-- 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>
|
<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>
|
</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 class="grid grid-cols-1 sm:grid-cols-2 gap-6">
|
||||||
<div>
|
<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>
|
<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">
|
<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
|
Gửi yêu cầu đặt tour
|
||||||
</button>
|
</button>
|
||||||
|
<p id="form-status" role="alert" class="hidden text-sm text-red-600" data-i18n="form_error"></p>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -476,6 +494,7 @@
|
|||||||
pkg_3: "Nghỉ dưỡng & Tắm bùn khoáng",
|
pkg_3: "Nghỉ dưỡng & Tắm bùn khoáng",
|
||||||
form_notes: "Yêu cầu đặc biệt",
|
form_notes: "Yêu cầu đặc biệt",
|
||||||
form_submit: "Gửi yêu cầu đặt tour",
|
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.",
|
footer_copy: "© 2026 Nha Trang Travel Guide. All rights reserved.",
|
||||||
modal_title: "Thành công!",
|
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.",
|
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: "Спа-отдых & Термальные источники",
|
pkg_3: "Спа-отдых & Термальные источники",
|
||||||
form_notes: "Пожелания / Заметки",
|
form_notes: "Пожелания / Заметки",
|
||||||
form_submit: "Отправить заявку",
|
form_submit: "Отправить заявку",
|
||||||
|
form_error: "Не удалось отправить заявку. Пожалуйста, попробуйте позже.",
|
||||||
footer_copy: "© 2026 Nha Trang Travel Guide. Все права защищены.",
|
footer_copy: "© 2026 Nha Trang Travel Guide. Все права защищены.",
|
||||||
modal_title: "Успешно!",
|
modal_title: "Успешно!",
|
||||||
modal_desc: "Ваша заявка отправлена. Мы свяжемся с вами в ближайшее время.",
|
modal_desc: "Ваша заявка отправлена. Мы свяжемся с вами в ближайшее время.",
|
||||||
@@ -628,6 +648,7 @@
|
|||||||
pkg_3: "Wellness Spa & Mineral Mud Baths",
|
pkg_3: "Wellness Spa & Mineral Mud Baths",
|
||||||
form_notes: "Special Requests",
|
form_notes: "Special Requests",
|
||||||
form_submit: "Submit Request",
|
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.",
|
footer_copy: "© 2026 Nha Trang Travel Guide. All rights reserved.",
|
||||||
modal_title: "Success!",
|
modal_title: "Success!",
|
||||||
modal_desc: "Your booking request has been sent. We will contact you shortly.",
|
modal_desc: "Your booking request has been sent. We will contact you shortly.",
|
||||||
@@ -704,6 +725,7 @@
|
|||||||
pkg_3: "温泉泥浴 & 养生SPA",
|
pkg_3: "温泉泥浴 & 养生SPA",
|
||||||
form_notes: "特殊需求 / 备注",
|
form_notes: "特殊需求 / 备注",
|
||||||
form_submit: "提交预订申请",
|
form_submit: "提交预订申请",
|
||||||
|
form_error: "暂时无法发送您的请求,请稍后重试。",
|
||||||
footer_copy: "© 2026 Nha Trang Travel Guide. 保留所有权利。",
|
footer_copy: "© 2026 Nha Trang Travel Guide. 保留所有权利。",
|
||||||
modal_title: "提交成功!",
|
modal_title: "提交成功!",
|
||||||
modal_desc: "您的预订申请已成功发送,我们将尽快与您联系。",
|
modal_desc: "您的预订申请已成功发送,我们将尽快与您联系。",
|
||||||
@@ -780,6 +802,7 @@
|
|||||||
pkg_3: "Wellness und Mineral-Schlammbäder",
|
pkg_3: "Wellness und Mineral-Schlammbäder",
|
||||||
form_notes: "Besondere Wünsche",
|
form_notes: "Besondere Wünsche",
|
||||||
form_submit: "Anfrage senden",
|
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.",
|
footer_copy: "© 2026 Nha Trang Travel Guide. Alle Rechte vorbehalten.",
|
||||||
modal_title: "Erfolgreich!",
|
modal_title: "Erfolgreich!",
|
||||||
modal_desc: "Ihre Anfrage wurde gesendet. Wir melden uns in Kürze bei Ihnen.",
|
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",
|
pkg_3: "Spa et bains de boue minérale",
|
||||||
form_notes: "Demandes particulières",
|
form_notes: "Demandes particulières",
|
||||||
form_submit: "Envoyer la demande",
|
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.",
|
footer_copy: "© 2026 Nha Trang Travel Guide. Tous droits réservés.",
|
||||||
modal_title: "Demande envoyée !",
|
modal_title: "Demande envoyée !",
|
||||||
modal_desc: "Votre demande a bien été envoyée. Nous vous contacterons bientôt.",
|
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();
|
event.preventDefault();
|
||||||
|
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');
|
document.getElementById('success-modal').classList.remove('hidden');
|
||||||
|
} catch {
|
||||||
|
status.classList.remove('hidden');
|
||||||
|
} finally {
|
||||||
|
submitButton.disabled = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeModal() {
|
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