Sunucu yanıtını kontrol edin

Sunucu yanıtı
NS kayıtları
Whois alanı
Yanıt başlıkları
İstek başlıkları
Ham HTML kodu
200 OK - knntl.com
HTTP Status: 200
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
Server: nginx/1.26.0 (Ubuntu)
Date: Sun, 25 May 2025 23:11:25 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Content-Type-Options: nosniff

HTTP Kodu 200 OK

200 http durum kodu, standart bir başarılı HTTP sunucu yanıtıdır. Bu, istemcinin isteğinin (örneğin, bir tarayıcıdan) başarıyla işlendiği ve sunucunun istenen verileri ilettiği anlamına gelir.

Kod 200 ne zaman kullanılır?

  • Bir web sayfası yüklenirken
  • Bir API yanıtı başarıyla alındığında
  • Bir form veya başka bir HTTP isteği işlenirken

Kod 200 kullanıcı için ne anlama gelir?

Kullanıcı içeriği hatasız alır ve sayfa veya uygulama düzgün çalışır. Kod 200'e veri eşlik ediyorsa, tarayıcı veya program bunu işler ve kullanıcıya görüntüler.

GET / HTTP/1.1
Host: knntl.com
Accept: */*
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
<html>

<head>
  <meta charset="UTF-8">
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
  <title>
    Home | garyfogelson.com  </title>

  <link href="/assets/css/styles.css" rel="stylesheet">  <script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
  <script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>

  <!-- Custom Font -->
    <style>
  @font-face {
    font-family: 'CustomFont';
    src: url('/media/pages/settings/c4a8fc52fe-1745817300/selectric-un-11-medium.otf') format('opentype');
  }

  .font-custom-font {
    font-family: 'CustomFont', sans-serif;
  }
  </style>
  

  <!-- Utils -->
  <script>
  function slugify(text) {
    return text.toString().replace(/\s+/g, "-");
  }

  function unslugify(text) {
    return text.toString().replace(/-/g, " ");
  }
  </script>

</head>

<body class="font-custom-font bg-[#f8f8f8]">
<script>
let currentRecentId = null;
let currentRandomId = null;
let currentImagePair = null;
let nextImagePair = null;
let previousImagePair = null;
let isLoading = false;

// Function to preload an image
function preloadImage(url, srcset) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.src = url;
    img.srcset = srcset;
    img.sizes = '45vw'
    img.onload = () => resolve(img);
    img.onerror = reject;
  });
}

// Function to fetch and preload image pairs
async function fetchImagePair(endpoint) {
  if (isLoading) return;
  isLoading = true;

  try {
    const credentials = btoa('[email protected]:testingtesting');
    const params = new URLSearchParams();
    if (currentRecentId) params.append('recent', currentRecentId);
    if (currentRandomId) params.append('random', currentRandomId);

    const response = await fetch(`/api/image-pairs/${endpoint}?${params.toString()}`, {
      headers: {
        'Authorization': `Basic ${credentials}`
      }
    });

    const data = await response.json();

    if (data.status === 'success') {
      // Randomly assign images to left/right
      const isRecentOnLeft = Math.random() < 0.5;
      const imagePair = {
        left: isRecentOnLeft ? data.data.recent : data.data.random,
        right: isRecentOnLeft ? data.data.random : data.data.recent
      };

      // Preload both images
      Promise.all([
        preloadImage(imagePair.left.url, imagePair.left.srcset),
        preloadImage(imagePair.right.url, imagePair.right.srcset)
      ]);

      return {
        data: imagePair,
        recentId: data.data.recent.id,
        randomId: data.data.random.id
      };
    } else {
      throw new Error(data.message || 'Failed to fetch images');
    }
  } catch (error) {
    console.error('Error preparing images:', error);
    return null;
  } finally {
    isLoading = false;
  }
}

// Function to update the images in the DOM
function updateImages(imageData, container) {
  if (!imageData) return;

  const leftContainer = container.querySelector('.left-image-container');
  const rightContainer = container.querySelector('.right-image-container');

  // Create new image elements
  const newLeftImg = document.createElement('img');
  const newRightImg = document.createElement('img');

  // Set aspect ratios immediately
  // leftContainer.style.aspectRatio = imageData.left.aspectRatio;
  // rightContainer.style.aspectRatio = imageData.right.aspectRatio;

  // Set up new images
  newLeftImg.src = imageData.left.url;
  newLeftImg.srcset = imageData.left.srcset;
  newLeftImg.alt = imageData.left.alt;
  leftContainer.href = `/${imageData.left.id}`;
  newLeftImg.className = getImageClass(imageData.left.orientation);

  newRightImg.src = imageData.right.url;
  newRightImg.srcset = imageData.right.srcset;
  newRightImg.alt = imageData.right.alt;
  rightContainer.href = `/${imageData.right.id}`;
  newRightImg.className = getImageClass(imageData.right.orientation);

  // Wait for both images to load before making any DOM changes
  Promise.all([
    new Promise(resolve => newLeftImg.onload = resolve),
    new Promise(resolve => newRightImg.onload = resolve)
  ]).then(() => {
    // Only after both images are loaded, update the DOM
    requestAnimationFrame(() => {
      // Remove old images
      const oldLeftImg = leftContainer.querySelector('img');
      const oldRightImg = rightContainer.querySelector('img');
      if (oldLeftImg) oldLeftImg.remove();
      if (oldRightImg) oldRightImg.remove();

      // Add new images
      leftContainer.appendChild(newLeftImg);
      rightContainer.appendChild(newRightImg);
    });
  });
}

// Function to handle displaying next pair and preparing the next one
async function getInitialImagePairs() {
  if (!currentImagePair) {
    currentImagePair = await fetchImagePair('');
  }

  if (currentImagePair) {
    // Update the current IDs
    currentRecentId = currentImagePair.recentId;
    currentRandomId = currentImagePair.randomId;

    // Show the preloaded images
    updateImages(currentImagePair.data, document.querySelector('.swiper-slide-active'));

    // Fetch the next pair in the background
    nextImagePair = await fetchImagePair('');
    previousImagePair = await fetchImagePair('previous');

    // Update all slides
    updateAllSlides();
  }
}

// Function to get image class based on orientation
function getImageClass(orientation) {
  return `object-contain select-none max-h-full max-w-full w-full ${orientation === 'portrait' 
    ? 'md:max-h-[45vw] md:w-auto'
    : 'md:max-w-[45vw] md:h-auto'}`;
}

// Function to create slide HTML
function createSlideHtml(imagePair) {
  return `
    <div class="swiper-slide">
      <div class="slide-content flex flex-col md:flex-row gap-5 items-center justify-evenly h-full w-full pb-5">
        <a class="left-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
          <img src="${imagePair.data.left.url}" 
               srcset="${imagePair.data.left.srcset}"
               alt="${imagePair.data.left.alt}"
               class="${getImageClass(imagePair.data.left.orientation)}" />
        </a>
        <a class="right-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
          <img src="${imagePair.data.right.url}"
               srcset="${imagePair.data.right.srcset}"
               alt="${imagePair.data.right.alt}"
               class="${getImageClass(imagePair.data.right.orientation)}" />
        </a>
      </div>
    </div>
  `;
}

async function addNextSlide() {
  if (!nextImagePair) {
    nextImagePair = await fetchImagePair('');
  }

  if (nextImagePair) {
    // Update the current IDs
    currentRecentId = nextImagePair.recentId;
    currentRandomId = nextImagePair.randomId;

    // Set current pair
    currentImagePair = nextImagePair;

    // Add the new slide
    const swiper = document.querySelector('.swiper')?.swiper;
    if (swiper) {
      swiper.appendSlide(createSlideHtml(nextImagePair));
    }

    // Clear the stored pair
    nextImagePair = null;

    // Fetch the next pair in the background
    nextImagePair = await fetchImagePair('');
  }
}

async function addPrevSlide() {
  if (!previousImagePair) {
    previousImagePair = await fetchImagePair('previous');
  }

  if (previousImagePair) {
    // Update the current IDs
    currentRecentId = previousImagePair.recentId;
    currentRandomId = previousImagePair.randomId;

    // Set current pair
    currentImagePair = previousImagePair;

    // Add the new slide
    const swiper = document.querySelector('.swiper')?.swiper;
    if (swiper) {
      swiper.prependSlide(createSlideHtml(previousImagePair));
    }

    // Clear the stored pair
    previousImagePair = null;

    // Fetch the previous pair in the background
    previousImagePair = await fetchImagePair('previous');
  }
}

// Function to update all slides
function updateAllSlides() {
  const swiper = document.querySelector('.swiper')?.swiper;
  if (!swiper) return;

  // Update previous slide
  if (previousImagePair) {
    updateImages(previousImagePair.data, swiper.slides[0]);
  }

  // Update current slide
  if (currentImagePair) {
    updateImages(currentImagePair.data, swiper.slides[1]);
  }

  // Update next slide
  if (nextImagePair) {
    updateImages(nextImagePair.data, swiper.slides[2]);
  }
}
</script>


<main x-data='{"hoveredImage":false}'
  :class="hoveredImage ? 'bg-white' : 'bg-[#f8f8f8]'" class="h-dvh w-screen flex flex-col gap-5">
  <div className="flex-none">
    
<nav x-data='{"showNav":false,"activeFilter":null,"filterValue":null,"years":["2025","2024","2023","2022","2021","2020","2019","2018","2017","2016","2014","2012","2011","2010","2009","2008","2007","2006","2005"],"months":["January","February","March","April","May","June","July","August","September","October","November","December"],"keywords":["bloopers","bw","cheers","cups","dead","dog","doubles","earth","flowers","Fran","gettin up","infrastructure","looking down","meals","modernism","never forget","on the bike","on the fence","orange","Other Means","paths","shrub","signs","sky","splat","split","squiggle","stuffed","stumped","that works","USA"]}'
  x-init="$watch('showNav', value => { document.body.style.overflow = value ? 'hidden' : '' })"
  @keydown.window.escape="showNav = false; activeFilter = null" class="bg-inherit relative z-50">
  <!-- Trigger -->
  <div class="p-5 pb-0">
    <button x-on:click="showNav = true" :class="showNav ? 'text-[#FFFFFF]' : 'text-black'" class="w-content text-left">
            Last updated: Tue May 13, 2025 by Gary Fogelson
          </button>
    <button x-show="showNav" x-on:click="showNav = false; activeFilter = null"
      class="inline-block text-black hover:text-white" x-cloak>
      Close
    </button>
  </div>

  <!-- Nav -->
  <div x-show="showNav" x-cloak
    class="text-black bg-[#CECECE] h-screen w-screen fixed top-0 left-0 p-5 flex flex-col gap-0 overflow-hidden">
    <p class="flex-none mb-4">
            <a href="/" class="text-black hover:text-white">Home</a>
            <span class="text-white">
        Last updated: Tue May 13, 2025 by Gary Fogelson
      </span>
      <button x-show="showNav" x-on:click="showNav = false; activeFilter = null"
        class="inline-block text-black hover:text-white" x-cloak>
        Close
      </button>
      <br />
      <span class="text-white">Filter by:</span>
      <button @click="activeFilter = activeFilter === 'year' ? null : 'year'"
        :class="activeFilter === 'year' ? 'text-white' : 'text-black'" class="hover:text-white">Year</button>,
      <button @click="activeFilter = activeFilter === 'month' ? null : 'month'"
        :class="activeFilter === 'month' ? 'text-white' : 'text-black'" class="hover:text-white">Month</button>,
      <button @click="activeFilter = activeFilter === 'keyword' ? null : 'keyword'"
        :class="activeFilter === 'keyword' ? 'text-white' : 'text-black'" class="hover:text-white">Keyword</button>
    </p>

    <!-- Year List -->
    <div x-show="activeFilter === 'year'" class="flex-1 min-h-0">
      <template x-for="year in years" :key="year">
        <p>
          <a :href="`/year/${slugify(year)}`"
            :class="filterValue === slugify(year) ? 'text-white' : 'text-black hover:text-white'" x-text="year"></a>
        </p>
      </template>
    </div>

    <!-- Month List -->
    <div x-show="activeFilter === 'month'" class="flex-1 min-h-0">
      <template x-for="month in months" :key="month">
        <p>
          <a :href="`/month/${slugify(month)}`"
            :class="filterValue === slugify(month) ? 'text-white' : 'text-black hover:text-white'" x-text="month"></a>
        </p>
      </template>
    </div>

    <!-- Keyword List -->
    <div x-show="activeFilter === 'keyword'" class="flex-1 min-h-0 sm:columns-4 lg:columns-8 gap-5 overflow-y-auto"
      style="column-fill: auto;">
      <template x-for="keyword in keywords" :key="keyword">
        <p>

          <a :href="`/keyword/${slugify(keyword)}`"
            :class="filterValue === slugify(keyword) ? 'text-white' : 'text-black hover:text-white'"
            x-text="keyword"></a>
        </p>
      </template>
    </div>
  </div>
</nav>  </div>

  <!-- Image Carousel (Desktop & Mobile) -->
  <div id="swiper-container" class="flex-1 min-h-0 px-5">
    <div class="swiper flex-1 min-h-0 max-h-full opacity-0 size-full cursor-pointer"
      @mouseenter="hoveredImage = true; document.body.style.backgroundColor = 'white'"
      @mouseleave="hoveredImage = false; document.body.style.backgroundColor = '#f8f8f8'">
      <div class="swiper-wrapper h-full">
        <!-- Previous Pair -->
        <div class="swiper-slide">
          <div class="slide-content flex flex-col md:flex-row gap-5 items-center justify-evenly h-full w-full pb-5">
            <a
              class="left-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
              <img src="" alt="" />
            </a>
            <a
              class="right-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
              <img src="" alt="" />
            </a>
          </div>
        </div>
        <!-- Current Pair -->
        <div class="swiper-slide h-full">
          <div class="slide-content flex flex-col md:flex-row gap-5 items-center justify-evenly h-full w-full pb-5">
            <a
              class="left-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
              <img src="" alt="" />
            </a>
            <a
              class="right-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
              <img src="" alt="" />
            </a>
          </div>
        </div>
        <!-- Next Pair -->
        <div class="swiper-slide">
          <div class="slide-content flex flex-col md:flex-row gap-5 items-center justify-evenly h-full w-full pb-5">
            <a
              class="left-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
              <img src="" alt="" />
            </a>
            <a
              class="right-image-container flex-1 md:flex-none flex md:inline items-center justify-center min-h-0 w-fit">
              <img src="" alt="" />
            </a>
          </div>
        </div>
      </div>
    </div>
  </div>
</main>

<script>
// Load initial pairs
getInitialImagePairs();

// Initialize Swiper
document.addEventListener('DOMContentLoaded', function() {
  const swiperEl = document.querySelector('.swiper');
  if (!swiperEl) return;

  let isMobile = window.innerWidth < 768;
  let clickHandler = null;
  let swiperInstance = null;

  // Function to update swiper height
  function updateSwiperHeight() {
    const container = document.getElementById('swiper-container');
    if (container && swiperInstance) {
      swiperEl.style.height = `${container.offsetHeight}px`;
      swiperInstance.update(); // Update swiper after height change
    }
  }

  const swiper = new Swiper(swiperEl, {
    direction: isMobile ? 'vertical' : 'horizontal',
    slidesPerView: 1,
    spaceBetween: 0,
    initialSlide: 1,
    allowTouchMove: isMobile,
    on: {
      init: function() {
        swiperInstance = this;
        swiperEl.style.opacity = '1';
        updateSwiperHeight(); // Set initial height
      }
    }
  });

  // Function to handle click events
  function handleClick(e) {
    // Advance to next slide without animation
    swiper.slideTo(swiper.activeIndex + 1, 0);
  }

  // Function to update mobile state and event listeners
  function updateMobileState() {
    const wasMobile = isMobile;
    isMobile = window.innerWidth < 768;

    // Only update if mobile state changed
    if (wasMobile !== isMobile) {
      // Update swiper direction
      swiper.changeDirection(isMobile ? 'vertical' : 'horizontal');
      swiper.params.allowTouchMove = isMobile;

      // Update click handler
      if (isMobile) {
        // Remove click handler if switching to mobile
        if (clickHandler) {
          document.body.removeEventListener('click', clickHandler);
          clickHandler = null;
        }
      } else {
        // Add click handler if switching to desktop
        if (!clickHandler) {
          clickHandler = handleClick;
          document.body.addEventListener('click', clickHandler);
        }
      }
    }
  }

  // Initial setup of click handler for desktop
  if (!isMobile) {
    clickHandler = handleClick;
    document.body.addEventListener('click', clickHandler);
  }

  // Add resize listeners
  window.addEventListener('resize', () => {
    updateMobileState();
    updateSwiperHeight();
  });

  // Handle all slide changes
  swiper.on('slideChange', function() {
    const direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';

    // Fetch the appropriate pair based on direction
    if (direction === 'next') {
      addNextSlide();
    } else {
      addPrevSlide();
    }
  });
});
</script>

</body>

</html>                               

Alan adının whois bilgisi

Domain Name: KNNTL.COM
Registry Domain ID: 2953069251_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.namecheap.com
Registrar URL: http://www.namecheap.com
Updated Date: 2025-01-23T16:45:34Z
Creation Date: 2025-01-23T16:45:28Z
Registry Expiry Date: 2026-01-23T16:45:28Z
Registrar: NameCheap, Inc.
Registrar IANA ID: 1068
Registrar Abuse Contact Email: [email protected]
Registrar Abuse Contact Phone: +1.6613102107
Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
Name Server: DNS1.REGISTRAR-SERVERS.COM
Name Server: DNS2.REGISTRAR-SERVERS.COM
DNSSEC: unsigned
URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
>>> Last update of whois database: 2025-05-25T23:11:12Z <<<
For more information on Whois status codes, please visit https://icann.org/epp
NOTICE: The expiration date displayed in this record is the date the
TERMS OF USE: You are not authorized to access or query our Whois
by the following terms of use: You agree that you may use this Data only
to: (1) allow, enable, or otherwise support the transmission of mass