<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hieu Le</title>
    <description>The latest articles on DEV Community by Hieu Le (@hieu_le_f3630aa13143b35d8).</description>
    <link>https://dev.to/hieu_le_f3630aa13143b35d8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3714028%2Fdc1c3efc-9877-4d3a-808a-0ccf7c86bf2d.png</url>
      <title>DEV Community: Hieu Le</title>
      <link>https://dev.to/hieu_le_f3630aa13143b35d8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hieu_le_f3630aa13143b35d8"/>
    <language>en</language>
    <item>
      <title>What Is Answer Engine Optimization (AEO)? SEO Differences</title>
      <dc:creator>Hieu Le</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:25:03 +0000</pubDate>
      <link>https://dev.to/hieu_le_f3630aa13143b35d8/what-is-answer-engine-optimization-aeo-seo-differences-126f</link>
      <guid>https://dev.to/hieu_le_f3630aa13143b35d8/what-is-answer-engine-optimization-aeo-seo-differences-126f</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://sitecheckly.com/blog/what-is-answer-engine-optimization" rel="noopener noreferrer"&gt;Sitecheckly&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Answer Engine Optimization (AEO) is the practice of structuring content so AI systems, such as Google AI Overviews, Perplexity, and ChatGPT, can extract direct answers to cite in responses. While traditional SEO focuses on ranking links in search engine results pages, AEO focuses on providing factual, machine-readable passages that language models can retrieve and synthesize.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Answer Engine Optimization and How Does It Work?
&lt;/h2&gt;

&lt;p&gt;Answer Engine Optimization (AEO) modifies how web content is structured so search engines and generative AI tools can parse, extract, and display direct answers. Traditional Search Engine Optimization (SEO) aims to position pages on a list of blue links. In contrast, AEO prepares pages for Retrieval-Augmented Generation (RAG) pipelines and conversational search interfaces.&lt;/p&gt;

&lt;p&gt;When a user submits a query to an AI answer engine, the engine parses index documents for direct factual matches. It evaluates content based on clarity, entity relationships, and factual density. If a paragraph immediately answers the prompt with clear syntax, the language model can easily extract and cite that passage.&lt;/p&gt;

&lt;p&gt;Many sites fail to provide these direct summaries. Data shows that 54% of the 96 sites audited on Sitecheckly in the last 90 days had this issue: "No concise answer-first paragraphs detected". When content lacks leading answer passages, answer engines are forced to summarize long paragraphs, increasing the probability that your site is omitted from the citation block.&lt;/p&gt;

&lt;p&gt;While traditional SEO drives organic traffic through click-throughs from search pages, AEO targets source inclusion in synthesized responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Difference Between AEO and SEO?
&lt;/h2&gt;

&lt;p&gt;Traditional SEO targets search algorithms that evaluate backlinks, page authority, and keyword placement to rank URLs. AEO targets language models seeking direct consensus answers to user questions.&lt;/p&gt;

&lt;p&gt;AEO requires tighter lexical boundaries. Statements must be self-contained so they retain full context when extracted independently from the surrounding article. Traditional SEO often relies on introducing context gradually across long introductions, which makes extraction harder for machine parsers.&lt;/p&gt;

&lt;p&gt;The metrics used to measure success also differ:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Optimization Vector&lt;/th&gt;
&lt;th&gt;Traditional SEO&lt;/th&gt;
&lt;th&gt;Answer Engine Optimization (AEO)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search engine crawlers and ranking algorithms&lt;/td&gt;
&lt;td&gt;Large Language Models (LLMs) and RAG pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Experience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Navigating to a site via ranked links&lt;/td&gt;
&lt;td&gt;Reading synthesized answers with source citations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Comprehensive guides, long-form copy&lt;/td&gt;
&lt;td&gt;Self-contained, 40 to 60 word direct answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Performance Metrics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Click-through rates, positions, pageviews&lt;/td&gt;
&lt;td&gt;AI citations, source mentions, featured answer snippets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entity Mapping&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implicit keyword targeting&lt;/td&gt;
&lt;td&gt;Explicit JSON-LD schema definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Do AI Answer Engines Need from a Page?
&lt;/h2&gt;

&lt;p&gt;To be eligible for citations in AI search interfaces, a webpage must satisfy four core technical and structural requirements:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Concise Answer-First Text
&lt;/h3&gt;

&lt;p&gt;Leading sections under headings must provide direct answers within 40 to 60 words. Avoid introductory filler phrases or rhetorical questions at the start of paragraphs. Provide the core fact or definition in the first sentence.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Semantic Heading Hierarchy
&lt;/h3&gt;

&lt;p&gt;Structure sections using explicit query phrases. In recent testing, 57% of the 96 sites audited on Sitecheckly in the last 90 days had this issue: "No question-style subheadings". Use subheadings that match real search intents, followed immediately by direct responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Explicit Structured Data
&lt;/h3&gt;

&lt;p&gt;Provide machine-readable entity metadata on every key page. Follow the &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/sd-policies" rel="noopener noreferrer"&gt;Google Search Central: Structured Data General Guidelines&lt;/a&gt; to ensure schema markup meets parser requirements.&lt;/p&gt;

&lt;p&gt;However, adoption remains low: 46% of the 96 sites audited on Sitecheckly in the last 90 days had this issue: "No Organization schema". Defining organization entities helps AI models verify published content against recognized brand sources defined in the &lt;a href="https://schema.org/Organization" rel="noopener noreferrer"&gt;Schema.org Organization Specification&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Unblocked Crawler Access
&lt;/h3&gt;

&lt;p&gt;AI answer engines rely on web crawlers to fetch documents for RAG systems. If your &lt;code&gt;robots.txt&lt;/code&gt; blocks AI crawlers, language models cannot retrieve your text for citations.&lt;/p&gt;

&lt;p&gt;Review the &lt;a href="https://platform.openai.com/docs/gptbot" rel="noopener noreferrer"&gt;OpenAI Platform Documentation: GPTBot&lt;/a&gt; to ensure your file permits crawler indexing. Here is an example &lt;code&gt;robots.txt&lt;/code&gt; configuration that grants access to GPTBot while managing crawler rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: GPTBot
Allow: /

User-agent: *
Disallow: /private/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Configure Structured Data for AEO
&lt;/h2&gt;

&lt;p&gt;Structured data gives AI engines explicit data about your site entities, authors, and main content topics. Using JSON-LD format provides the cleanest parsing experience for search bots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Organization and Article Schema
&lt;/h3&gt;

&lt;p&gt;Combine &lt;code&gt;Organization&lt;/code&gt; and &lt;code&gt;Article&lt;/code&gt; schema types on target articles to anchor content to a verified publisher entity. Refer to the &lt;a href="https://schema.org/Organization" rel="noopener noreferrer"&gt;Schema.org Organization Specification&lt;/a&gt; for supported properties like &lt;code&gt;sameAs&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@graph"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Organization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/#organization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Tech"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sameAs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"https://www.wikidata.org/wiki/Q000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"https://twitter.com/exampletech"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/aeo-guide/#article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"isPartOf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WebPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/aeo-guide/"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What Is Answer Engine Optimization?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Learn what Answer Engine Optimization (AEO) is and how to structure your pages for AI search engines."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"publisher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/#organization"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mainEntityOfPage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/aeo-guide/"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  FAQPage Schema
&lt;/h3&gt;

&lt;p&gt;When publishing question-and-answer pairs, embed &lt;code&gt;FAQPage&lt;/code&gt; markup. Follow &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/sd-policies" rel="noopener noreferrer"&gt;Google Search Central: Structured Data General Guidelines&lt;/a&gt; to format question blocks correctly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FAQPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainEntity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Question"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Does AEO replace traditional SEO?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"acceptedAnswer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Answer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"No. AEO builds on baseline technical SEO, crawlability, and indexing to make content digestible for generative answer engines."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Audit a Page for AEO Readiness
&lt;/h2&gt;

&lt;p&gt;Optimizing a URL for AI search requires auditing content structure, entity data, and access directives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Analyze Single-Page Technical Readiness
&lt;/h3&gt;

&lt;p&gt;Enter a target URL into &lt;a href="https://sitecheckly.com" rel="noopener noreferrer"&gt;Sitecheckly&lt;/a&gt; to review single-page crawlability, meta elements, and passive security headers in a single run. Sitecheckly audits one page at a time with no sign-up required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Evaluate Heading and Paragraph Structure
&lt;/h3&gt;

&lt;p&gt;Review your headings to confirm they ask direct questions. Check that the opening 40 to 60 words under each H2 or H3 contain factual definitions rather than introductory filler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Inspect Crawler Directives
&lt;/h3&gt;

&lt;p&gt;Check your server's &lt;code&gt;robots.txt&lt;/code&gt; configuration to confirm that user agents like &lt;code&gt;GPTBot&lt;/code&gt; or &lt;code&gt;PerplexityBot&lt;/code&gt; are allowed to fetch your assets. You can verify user-agent syntax directly in the &lt;a href="https://platform.openai.com/docs/gptbot" rel="noopener noreferrer"&gt;OpenAI Platform Documentation: GPTBot&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to do next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Audit your high-traffic informational URLs to identify missing answer-first summary paragraphs.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Organization&lt;/code&gt; and &lt;code&gt;Article&lt;/code&gt; JSON-LD schema blocks to define your brand entities clearly.&lt;/li&gt;
&lt;li&gt;Update your &lt;code&gt;robots.txt&lt;/code&gt; file to ensure AI fetchers can retrieve your pages.&lt;/li&gt;
&lt;li&gt;Run a single-page check on &lt;a href="https://sitecheckly.com" rel="noopener noreferrer"&gt;Sitecheckly&lt;/a&gt; to test your page setup and security headers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does AEO replace traditional SEO?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. AEO builds on baseline technical SEO, crawlability, and indexing to make content digestible for generative answer engines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which schema types help most with AEO?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Organization, Article, and FAQPage schemas help search engines and models identify entities and direct answer snippets reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can I check if my page is optimized for answer engines?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run your URL through the Sitecheckly AEO audit to inspect your answer paragraphs, heading hierarchy, and structured data implementation.&lt;/p&gt;




&lt;p&gt;Want to see how your own site does? Run a free audit at &lt;a href="https://sitecheckly.com/?utm_source=devto" rel="noopener noreferrer"&gt;sitecheckly.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figures in this article come from Sitecheckly's own audit data; see the &lt;a href="https://sitecheckly.com/methodology" rel="noopener noreferrer"&gt;methodology&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aeo</category>
      <category>seo</category>
      <category>structureddata</category>
      <category>aisearch</category>
    </item>
    <item>
      <title>Security Headers List: 6 Headers Every Site Needs in 2026</title>
      <dc:creator>Hieu Le</dc:creator>
      <pubDate>Sun, 01 Nov 2026 07:02:43 +0000</pubDate>
      <link>https://dev.to/hieu_le_f3630aa13143b35d8/security-headers-list-6-headers-every-site-needs-in-2026-1213</link>
      <guid>https://dev.to/hieu_le_f3630aa13143b35d8/security-headers-list-6-headers-every-site-needs-in-2026-1213</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://sitecheckly.com/blog/security-headers-list-recommended-values" rel="noopener noreferrer"&gt;Sitecheckly&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A robust security headers list includes Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and Permissions-Policy. These HTTP response headers protect against cross-site scripting (XSS), clickjacking, MIME sniffing, and unwanted data leaks. Implementing them requires adding simple response directives in your web server or hosting configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are security headers critical for website protection?
&lt;/h2&gt;

&lt;p&gt;HTTP security headers instruct web browsers to enforce security restrictions. They act as a defense layer directly inside the client browser, reducing your attack surface without requiring alterations to your application code.&lt;/p&gt;

&lt;p&gt;When HTTP response headers are missing, browsers default to permissive behaviors. This exposes your users to common web vulnerabilities such as clickjacking, session hijacking, and cross-site scripting (XSS). According to guidelines from the &lt;a href="https://owasp.org/www-project-secure-headers/" rel="noopener noreferrer"&gt;OWASP Secure Headers Project&lt;/a&gt;, deploying server-level response directives is one of the most effective ways to secure web applications.&lt;/p&gt;

&lt;p&gt;Despite their importance, missing security headers remain widespread across the web. 84% of the 97 sites audited on Sitecheckly in the last 90 days had this issue: "Missing security headers". Adding these headers takes only a few minutes and significantly hardens your infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the 6 security headers every website should send?
&lt;/h2&gt;

&lt;p&gt;Here are the six essential HTTP security headers recommended for production websites.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header Name&lt;/th&gt;
&lt;th&gt;Recommended Value&lt;/th&gt;
&lt;th&gt;Primary Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Strict-Transport-Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max-age=31536000; includeSubDomains&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Forces HTTPS connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content-Security-Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default-src 'self'; script-src 'self'; object-src 'none';&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restricts resource loading to block XSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;X-Frame-Options&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DENY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Blocks iframe embedding to prevent clickjacking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;X-Content-Type-Options&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nosniff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stops MIME type sniffing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Referrer-Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controls referrer data sent in request headers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permissions-Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;camera=(), microphone=(), geolocation=()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disables unwanted browser features&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. Strict-Transport-Security (HSTS)
&lt;/h3&gt;

&lt;p&gt;HSTS forces browsers to interact with your website exclusively over encrypted HTTPS connections. It protects users against protocol downgrade attacks and cookie hijacking.&lt;/p&gt;

&lt;p&gt;3 of the 5 sites audited on Sitecheckly in the last 90 days had this issue: "Missing HSTS (Strict-Transport-Security)" (small sample). You can learn more about directives such as &lt;code&gt;max-age&lt;/code&gt;, &lt;code&gt;includeSubDomains&lt;/code&gt;, and &lt;code&gt;preload&lt;/code&gt; in the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security" rel="noopener noreferrer"&gt;MDN HSTS documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Warning: Adding the &lt;code&gt;preload&lt;/code&gt; directive submits your domain to browser-hardcoded HSTS preload lists. HSTS preloading is difficult and slow to undo if you misconfigure HTTPS or need to drop back to HTTP. Do not include &lt;code&gt;preload&lt;/code&gt; until you have tested your HTTPS setup thoroughly and confirmed all subdomains support HTTPS.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Content-Security-Policy (CSP)
&lt;/h3&gt;

&lt;p&gt;Content-Security-Policy controls which dynamic resources (scripts, stylesheets, images) the browser is allowed to load. By restricting resource origins, CSP blocks unauthorized inline scripts and mitigates XSS attacks.&lt;/p&gt;

&lt;p&gt;5 of the 5 sites audited on Sitecheckly in the last 90 days had this issue: "Missing Content-Security-Policy (CSP)" (small sample). Review the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy" rel="noopener noreferrer"&gt;MDN CSP documentation&lt;/a&gt; for syntax and implementation details.&lt;/p&gt;

&lt;p&gt;Note on &lt;code&gt;'unsafe-inline'&lt;/code&gt;: Including &lt;code&gt;'unsafe-inline'&lt;/code&gt; in your &lt;code&gt;style-src&lt;/code&gt; or &lt;code&gt;script-src&lt;/code&gt; directives disables XSS protection for inline elements. Attackers can inject malicious inline styles or scripts if this keyword is present. Use nonces, hashes, or external stylesheets instead of &lt;code&gt;'unsafe-inline'&lt;/code&gt; whenever possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. X-Frame-Options
&lt;/h3&gt;

&lt;p&gt;X-Frame-Options controls whether your website can be embedded in &lt;code&gt;&amp;lt;frame&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt;, or &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt; elements. Setting this header to &lt;code&gt;DENY&lt;/code&gt; or &lt;code&gt;SAMEORIGIN&lt;/code&gt; prevents clickjacking attacks, where malicious sites overlay invisible frames over your interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. X-Content-Type-Options
&lt;/h3&gt;

&lt;p&gt;Browsers sometimes attempt to guess (sniff) the MIME type of a file if the server does not state it correctly. An attacker could upload a text file containing malicious script tags and trick the browser into executing it. Setting &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; forces the browser to adhere strictly to the declared &lt;code&gt;Content-Type&lt;/code&gt; header.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Referrer-Policy
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Referrer-Policy&lt;/code&gt; header determines how much URL information is sent in the &lt;code&gt;Referer&lt;/code&gt; request header when users navigate away from your page. Using &lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt; sends full URL paths for same-origin requests, but sends only the domain origin for cross-origin HTTPS requests, preventing sensitive query parameters from leaking to third parties.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Permissions-Policy
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Permissions-Policy&lt;/code&gt; allows site owners to restrict access to browser features and APIs. Disabling unused hardware features like the camera, microphone, and geolocation API reduces potential abuse if your application is compromised.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you configure security headers in Nginx?
&lt;/h2&gt;

&lt;p&gt;To set security headers in Nginx, use the &lt;code&gt;add_header&lt;/code&gt; directive inside your &lt;code&gt;server&lt;/code&gt; or &lt;code&gt;location&lt;/code&gt; block. Always append the &lt;code&gt;always&lt;/code&gt; parameter to ensure headers are sent regardless of the response status code (including 4xx and 5xx errors).&lt;/p&gt;

&lt;p&gt;Note: Nginx directives defined at an upper block level are overridden if a child block defines its own &lt;code&gt;add_header&lt;/code&gt; directive. Ensure all required headers are present in child blocks if defined locally.&lt;/p&gt;

&lt;p&gt;Warning: The CSP directive below includes &lt;code&gt;'unsafe-inline'&lt;/code&gt; in &lt;code&gt;style-src&lt;/code&gt; as a temporary compatibility fallback for legacy inline styles. Using &lt;code&gt;'unsafe-inline'&lt;/code&gt; exposes your site to style injection attacks. Remove &lt;code&gt;'unsafe-inline'&lt;/code&gt; once inline styles are moved to external files or secured with nonces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Security Headers&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;"max-age=31536000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;includeSubDomains"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt; &lt;span class="s"&gt;"default-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;script-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;style-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt; &lt;span class="s"&gt;'unsafe-inline'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;img-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt; &lt;span class="s"&gt;data:&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kn"&gt;object-src&lt;/span&gt; &lt;span class="s"&gt;'none'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="kn"&gt;"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;"DENY"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;"nosniff"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;"strict-origin-when-cross-origin"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Permissions-Policy&lt;/span&gt; &lt;span class="s"&gt;"camera=(),&lt;/span&gt; &lt;span class="s"&gt;microphone=(),&lt;/span&gt; &lt;span class="s"&gt;geolocation=()"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How do you configure security headers in Apache?
&lt;/h2&gt;

&lt;p&gt;In Apache, use &lt;code&gt;mod_headers&lt;/code&gt; to apply security headers across your application. You can place these directives in your main &lt;code&gt;httpd.conf&lt;/code&gt; server configuration file or within an &lt;code&gt;.htaccess&lt;/code&gt; file in your document root directory.&lt;/p&gt;

&lt;p&gt;Always use &lt;code&gt;Header always set&lt;/code&gt; instead of &lt;code&gt;Header set&lt;/code&gt; to ensure headers are included in error responses as well as success responses.&lt;/p&gt;

&lt;p&gt;Warning: The CSP directive below includes &lt;code&gt;'unsafe-inline'&lt;/code&gt; in &lt;code&gt;style-src&lt;/code&gt; as a temporary compatibility fallback for legacy inline styles. Using &lt;code&gt;'unsafe-inline'&lt;/code&gt; exposes your site to style injection attacks. Remove &lt;code&gt;'unsafe-inline'&lt;/code&gt; once inline styles are moved to external files or secured with nonces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="sr"&gt; mod_headers.c&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Strict-Transport-Security "max-age=31536000; includeSubDomains"
    &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none';"
    &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-Frame-Options "DENY"
    &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; X-Content-Type-Options "nosniff"
    &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Referrer-Policy "strict-origin-when-cross-origin"
    &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;always&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Permissions-Policy "camera=(), microphone=(), geolocation=()"
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How do you set response headers in Cloudflare, Next.js, and Vercel?
&lt;/h2&gt;

&lt;p&gt;Deployments using modern hosting platforms or edge networks offer dedicated configuration mechanisms for HTTP headers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloudflare
&lt;/h3&gt;

&lt;p&gt;You can add response headers at the edge using Cloudflare HTTP Response Header Transform Rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to your Cloudflare Dashboard and select your domain.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Rules&lt;/strong&gt; &amp;gt; &lt;strong&gt;Transform Rules&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Modify Response Header&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create rule&lt;/strong&gt;, name your rule, and set matching criteria to &lt;strong&gt;All incoming requests&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Set dynamic&lt;/strong&gt; or &lt;strong&gt;Set static&lt;/strong&gt; for each header name (e.g., &lt;code&gt;Strict-Transport-Security&lt;/code&gt;) and enter your target value.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Next.js
&lt;/h3&gt;

&lt;p&gt;In Next.js applications, define HTTP response headers in &lt;code&gt;next.config.js&lt;/code&gt; using the &lt;code&gt;headers()&lt;/code&gt; async function. Refer to the &lt;a href="https://nextjs.org/docs/app/api-reference/config/next-config-js/headers" rel="noopener noreferrer"&gt;Next.js headers documentation&lt;/a&gt; for full syntax details.&lt;/p&gt;

&lt;p&gt;Note: The &lt;code&gt;style-src&lt;/code&gt; directive below contains &lt;code&gt;'unsafe-inline'&lt;/code&gt;, which reduces CSP security by allowing inline CSS execution. Remove this keyword when your application no longer relies on inline styles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** @type {import('next').NextConfig} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/:path*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Strict-Transport-Security&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;max-age=31536000; includeSubDomains&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Security-Policy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none';&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DENY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Content-Type-Options&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nosniff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Referrer-Policy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;strict-origin-when-cross-origin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Permissions-Policy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;camera=(), microphone=(), geolocation=()&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vercel
&lt;/h3&gt;

&lt;p&gt;If you deploy static assets or custom backends to Vercel without Next.js, configure headers using a &lt;code&gt;vercel.json&lt;/code&gt; file in your root directory:&lt;/p&gt;

&lt;p&gt;Note: The &lt;code&gt;style-src&lt;/code&gt; directive below contains &lt;code&gt;'unsafe-inline'&lt;/code&gt;, which reduces CSP security by allowing inline CSS execution. Remove this keyword when your application no longer relies on inline styles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/(.*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Strict-Transport-Security"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"max-age=31536000; includeSubDomains"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Content-Security-Policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none';"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X-Frame-Options"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DENY"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X-Content-Type-Options"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nosniff"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Referrer-Policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"strict-origin-when-cross-origin"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Permissions-Policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"camera=(), microphone=(), geolocation=()"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to test and verify your HTTP security headers?
&lt;/h2&gt;

&lt;p&gt;After deploying your configuration, verify that your web server outputs the correct response headers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Command Line Verification
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;curl&lt;/code&gt; to inspect response headers for your domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the command output to verify that all six headers appear with their expected values.&lt;/p&gt;

&lt;h3&gt;
  
  
  Browser Developer Tools
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Google Chrome, Firefox, or Safari.&lt;/li&gt;
&lt;li&gt;Open Developer Tools (&lt;code&gt;F12&lt;/code&gt; or &lt;code&gt;Cmd + Option + I&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Network&lt;/strong&gt; tab and refresh the page.&lt;/li&gt;
&lt;li&gt;Click the main request for your domain and inspect the &lt;strong&gt;Response Headers&lt;/strong&gt; panel.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Automated Audits
&lt;/h3&gt;

&lt;p&gt;A quick &lt;code&gt;curl&lt;/code&gt; shows one response; it will not tell you whether a header value is weak or whether the rest of your setup (TLS, cookies, DNS records) is in order. Run the &lt;a href="https://sitecheckly.com/security-audit" rel="noopener noreferrer"&gt;Sitecheckly Security Audit&lt;/a&gt; on your home page and your login page to check all six headers plus the rest of the passive security checks in one pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Choose the configuration snippet above for your specific web server or hosting platform.&lt;/li&gt;
&lt;li&gt;Update your server configuration or application repository and deploy the changes.&lt;/li&gt;
&lt;li&gt;Run a scan using &lt;code&gt;curl -I&lt;/code&gt; or the &lt;a href="https://sitecheckly.com/security-audit" rel="noopener noreferrer"&gt;Sitecheckly Security Audit&lt;/a&gt; to verify all six security headers are present.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Will adding a Content-Security-Policy break my website?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It can if configured too strictly. Test your CSP in report-only mode using Content-Security-Policy-Report-Only before enforcing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is X-Frame-Options redundant if I already use Content-Security-Policy?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CSP frame-ancestors supersedes X-Frame-Options in modern browsers, but setting X-Frame-Options DENY or SAMEORIGIN ensures legacy browser protection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is Strict-Transport-Security not taking effect on initial HTTP requests?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HSTS headers sent over unencrypted HTTP are ignored by browsers. You must serve HSTS over a valid HTTPS connection.&lt;/p&gt;




&lt;p&gt;Want to see how your own site does? Run a free audit at &lt;a href="https://sitecheckly.com/?utm_source=devto" rel="noopener noreferrer"&gt;sitecheckly.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figures in this article come from Sitecheckly's own audit data; see the &lt;a href="https://sitecheckly.com/methodology" rel="noopener noreferrer"&gt;methodology&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>securityheaders</category>
      <category>nginx</category>
      <category>apache</category>
      <category>vercel</category>
    </item>
  </channel>
</rss>
