Store
 

VPN Tracker 是否支援 SSL VPN? - KH1655

常見問題

VPN Tracker 是否支援 SSL VPN?
 
有些 VPN 供應商提供「SSL VPN」,作為 IPsec VPN 的替代方案。SSL VPN 並不是一個單一的標準,而是每個供應商都有自己特定的「SSL VPN」。 VPN Tracker 365 僅提供對 SonicWALL SSL 連接的完整支援,但我們計畫在未來支援其他一些流行的 SSL VPN 變體。 如果您有希望我們提供支援的 SSL VPN 連接,請 { element.addEventListener("mousedown", function(event) { if (event.detail > 1) { event.preventDefault(); } }); }); } function refreshCurrentLang(lang) { const url = new URL(window.location.href); url.searchParams.set('lang', lang); url.pathname = url.pathname.replace('/' + initialLang + '/faq', '/' + lang + '/faq'); url.pathname = url.pathname.replace('/us/faq', '/' + lang + '/faq'); url.pathname = url.pathname.replace('/en/faq', '/' + lang + '/faq'); window.history.pushState({}, '', url); window.location.reload(); } function resetFilters() { articleId = null; searchTerm = null; document.getElementById('faq-search').value = ''; } function setupSearchHandler() { const searchInput = document.getElementById('faq-search'); const searchIcon = document.querySelector('.search-icon'); if (!searchInput || !searchIcon) { return; } searchIcon.addEventListener('click', function() { searchInput.focus(); // Focus input when icon is clicked }); searchInput.addEventListener('input', function() { searchTerm = searchInput.value.toLowerCase().trim(); updateFilters(); }); if (initialSearchTerm) { searchInput.value = initialSearchTerm; searchTerm = initialSearchTerm.toLowerCase().trim(); updateFilters(); } } function toggeProductArticleFilter(id) { if (articleId == id) { articleId = null; } else { articleId = id; } updateFilters(); } function updateFilters() { refreshProductArticleFilter(); refreshSearchFilter(); } function refreshProductArticleFilter() { const faqItems = document.querySelectorAll('.faq-item'); if (faqItems.length == 0) { return; } let mode = 'filter'; if (articleId == null) { const productArticles = document.querySelectorAll('.faq-product-article-item'); productArticles.forEach(item => { item.classList.remove('selected'); }); mode = 'reset'; } else { const productArticle = document.getElementById('product-article-' + articleId); if (!productArticle) { return; } productArticle.classList.add('selected'); const productArticles = document.querySelectorAll('.faq-product-article-item'); productArticles.forEach(item => { // only if not the current one if (item.id != productArticle.id) { item.classList.remove('selected'); } }); } faqItems.forEach(item => { let articles = item.getAttribute('data-product-articles'); if (!articles) { articles = ""; } articleTest = articles.split(',').filter(function(e) { return e.trim() != ''; }); const artikels = articles.split(','); item.style.display = (mode == 'reset' || articleTest.length == 0 || artikels.includes(articleId)) ? '' : 'none'; }); } function refreshSearchFilter() { if (!searchTerm) { return; } const searchWords = searchTerm.split(/\s+/); const faqItems = document.querySelectorAll('.faq-item'); faqItems.forEach(item => { const rawData = item.getAttribute('data-search-info'); const searchData = decodeHtmlEntities(rawData).toLowerCase(); const matchesAll = searchWords.every(word => searchData.includes(word)); item.style.display = (matchesAll && item.style.display != 'none') ? '' : 'none'; }); } function decodeHtmlEntities(encodedString) { const textArea = document.createElement('textarea'); textArea.innerHTML = encodedString; return textArea.value; } function jumpToInitial(faqId) { if (faqId) { const faqItem = document.getElementById('faq-item-' + faqId); if (faqItem) { setTimeout(() => { faqItem.scrollIntoView({ behavior: 'instant', block: 'start', inline: 'nearest' }); }, 1); } } } function openInitialFaq(faqId) { if (!faqId) { return; } let faqElement = document.getElementById("faq-answer-" + faqId); if (faqElement) { faqElement.classList.add("show"); } let faqItemPreloaded = document.getElementById('faq-answer-preloaded-' + faqId); if (faqItemPreloaded) { faqItemPreloaded.classList.remove('collapse'); lastFAQIdOpened = faqId; } } var lastFAQIdOpened = null; function toggleFaq(faqId) { let faqElement = document.getElementById("faq-answer-" + faqId); let contentContainer = document.getElementById('faq-answer-content-' + faqId); if (faqElement.classList.contains("show")) { faqElement.classList.remove("show"); let faqItemPreloaded = document.getElementById('faq-answer-preloaded-' + faqId); if (faqItemPreloaded) { faqItemPreloaded.classList.add('collapse'); } if (lastFAQIdOpened == faqId) { lastFAQIdOpened = null; } } else { faqElement.classList.add("show"); let faqItemPreloaded = document.getElementById('faq-answer-preloaded-' + faqId); if (faqItemPreloaded) { faqItemPreloaded.classList.remove('collapse'); } faqDisplayPreActions(faqId); if (lastFAQIdOpened == faqId) { return false; } lastFAQIdOpened = faqId; Livewire.dispatch("loadFAQDetails", { faqId: faqId }); // setTimeout(() => { // Livewire.dispatch("loadFAQDetails", { // faqId: faqId // }); // }, 1); } } window.addEventListener('faqLoaded', function(event) { let faqId = event.detail?.faqId; let content = event.detail?.content; let contentContainer = document.getElementById('faq-answer-content-' + faqId); if (content && contentContainer) { let faqElement = document.getElementById("faq-answer-" + faqId); if (!faqElement.classList.contains("show")) { faqElement.classList.add("show"); } contentContainer.innerHTML = content; let faqItemPreloaded = document.getElementById('faq-answer-preloaded-' + faqId); if (faqItemPreloaded) { faqItemPreloaded.classList.add('collapse'); } faqDisplayPostActions(faqId); } }); function generateSlugLink(faqId, faqItem) { const slug = faqItem.getAttribute('data-slug'); const question = faqItem.querySelector('.faq-question').innerText; const productid = faqItem.getAttribute('data-productid'); return `/zh-Hant/faq/${faqId}/${productid}/${slug}/KH${faqId}?identifier=equinux.com`; } function faqDisplayPreActions(faqId) { const faqItem = document.getElementById('faq-item-' + faqId); if (!faqItem) { return; } const newUrl = generateSlugLink(faqId, faqItem); history.pushState(null, '', newUrl); } function faqDisplayPostActions(faqId) { const faqItem = document.getElementById('faq-item-' + faqId); if (!faqItem) { return; } // update all the meta info updateFAQMetaInfo(faqId); // register new handlers setTimeout(() => { updateFilters(); setupRatingHandlers(); }, 1); } function updateFAQMetaInfo(faqId) { const faqItem = document.getElementById('faq-item-' + faqId); if (!faqItem) { return; } // fetch the question and answer aswell as the data-search-info const question = faqItem.querySelector('.faq-question').innerText; const answer = faqItem.querySelector('.faq-answer-content').innerText; const searchInfo = faqItem.getAttribute('data-search-info'); // remove all html tags and newlines from the question and answer const cleanQuestion = question.replace(/<\/?[^>]+(>|$)/g, "").replace(/\n/g, " "); const cleanAnswer = answer.replace(/<\/?[^>]+(>|$)/g, "").replace(/\n/g, " "); // update the canonical URL const hostname = window.location.hostname; const protocol = window.location.protocol; const port = window.location.port ? ':' + window.location.port : ''; const newUrl = generateSlugLink(faqId, faqItem); const canonicalUrl = `${protocol}//${hostname}${port}${newUrl}`; const canonicalLink = document.querySelector('link[rel="canonical"]'); if (canonicalLink) { canonicalLink.setAttribute('href', canonicalUrl); } else { const newCanonicalLink = document.createElement('link'); newCanonicalLink.setAttribute('rel', 'canonical'); newCanonicalLink.setAttribute('href', canonicalUrl); document.head.appendChild(newCanonicalLink); } // also update the document title const title = document.querySelector('title'); if (title) { title.innerText = cleanQuestion; } // update the meta title const metaTitle = document.querySelector('meta[name="title"]'); if (metaTitle) { metaTitle.setAttribute('content', cleanQuestion); } else { const newMetaTitle = document.createElement('meta'); newMetaTitle.setAttribute('name', 'title'); newMetaTitle.setAttribute('content', cleanQuestion); document.head.appendChild(newMetaTitle); } // update the meta description const metaDescription = document.querySelector('meta[name="description"]'); if (metaDescription) { metaDescription.setAttribute('content', cleanQuestion + ' ' + cleanAnswer); } // update the meta keywords const metaKeywords = document.querySelector('meta[name="keywords"]'); if (metaKeywords) { metaKeywords.setAttribute('content', searchInfo); } // update/create the meta og:title const metaOgTitle = document.querySelector('meta[property="og:title"]'); if (metaOgTitle) { metaOgTitle.setAttribute('content', cleanQuestion); } else { const newMetaOgTitle = document.createElement('meta'); newMetaOgTitle.setAttribute('property', 'og:title'); newMetaOgTitle.setAttribute('content', cleanQuestion); document.head.appendChild(newMetaOgTitle); } // update/create the meta og:description const metaOgDescription = document.querySelector('meta[property="og:description"]'); if (metaOgDescription) { metaOgDescription.setAttribute('content', cleanQuestion + ' ' + cleanAnswer); } // update/create the meta og:url const metaOgUrl = document.querySelector('meta[property="og:url"]'); if (metaOgUrl) { metaOgUrl.setAttribute('content', canonicalUrl); } else { const newMetaOgUrl = document.createElement('meta'); newMetaOgUrl.setAttribute('property', 'og:url'); newMetaOgUrl.setAttribute('content', canonicalUrl); document.head.appendChild(newMetaOgUrl); } } let currentProductSelection = null; function setupProductObserver() { const productDropdown = document.getElementById('productDropdown'); if (productDropdown) { productDropdown.addEventListener('click', function() { const dropdownItems = document.querySelectorAll('.dropdown-item'); dropdownItems.forEach(item => { item.addEventListener('click', function() { let newProductSelection = this.textContent.trim(); if (newProductSelection != currentProductSelection) { currentProductSelection = newProductSelection; } resetFilters(); }); }); }); } } function isElementInViewport(el) { const rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } function setupRatingHandlers() { document.querySelectorAll('.rating-star').forEach(star => { if (star.classList.contains('disabled')) { return; } star.addEventListener('mouseover', function() { const faqid = this.getAttribute('data-faq-id'); const rating = parseInt(this.getAttribute('data-rating')); document.querySelectorAll(`.rating-star[data-faq-id="${faqid}"]`).forEach(s => { if (parseInt(s.getAttribute('data-rating')) <= rating) { s.classList.remove('waiting'); s.classList.add('selected'); } else { s.classList.remove('selected'); s.classList.add('waiting'); } }); }); star.addEventListener('mouseout', function() { const faqid = this.getAttribute('data-faq-id'); document.querySelectorAll(`.rating-star[data-faq-id="${faqid}"]`).forEach(s => { if (!s.classList.contains('disabled')) { s.classList.remove('selected'); s.classList.add('waiting'); } }); }); }); document.querySelectorAll('.rating-star').forEach(button => { button.addEventListener('click', function(event) { event.preventDefault(); const faqId = this.getAttribute('data-faq-id'); const rating = this.getAttribute('data-rating'); const url = `/rate/stars/faq/${faqId}/0/zh-Hant/${rating}`; const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'X-Requested-With': 'XMLHttpRequest' }, // body: JSON.stringify({ // rating: rating // }) }) .then(response => response.json()) .then(data => { if (data && data === 1) { document.querySelectorAll(`.rating-star[data-faq-id="${faqId}"]`).forEach(btn => { btn.classList.remove('waiting'); btn.classList.add('disabled'); if (parseInt(btn.getAttribute('data-rating')) <= rating) { btn.classList.add('selected'); } else { btn.classList.add('inactive'); } }); // this.classList.add('selected'); } }) .catch(data => console.error('Error:', data)); }); }); document.querySelectorAll('.helpful-btn').forEach(button => { button.addEventListener('click', function(event) { event.preventDefault(); const faqId = this.getAttribute('data-faq-id'); const helpful = this.getAttribute('data-helpful'); const url = `/rate/helpful/faq/${faqId}/0/zh-Hant/${helpful}`; const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, 'X-Requested-With': 'XMLHttpRequest' }, // body: JSON.stringify({ // helpful: helpful // }) }) .then(response => response.json()) .then(data => { if (data && data === 1) { document.querySelectorAll(`.helpful-btn[data-faq-id="${faqId}"]`).forEach(btn => { btn.classList.remove('waiting'); btn.classList.add('inactive'); btn.classList.add('disabled'); }); this.classList.add('selected'); } }) .catch(data => console.error('Error:', data)); }); }); }