aboutsummaryrefslogtreecommitdiff
path: root/blog/redirect-github-pages
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-03-04 22:34:28 -0600
committerChristian Cleberg <hello@cleberg.net>2024-03-04 22:34:28 -0600
commit797a1404213173791a5f4126a77ad383ceb00064 (patch)
treefcbb56dc023c1e490df70478e696041c566e58b4 /blog/redirect-github-pages
parent3db79e7bb6a34ee94935c22d7f0e18cf227c7813 (diff)
downloadcleberg.net-797a1404213173791a5f4126a77ad383ceb00064.tar.gz
cleberg.net-797a1404213173791a5f4126a77ad383ceb00064.tar.bz2
cleberg.net-797a1404213173791a5f4126a77ad383ceb00064.zip
initial migration to test org-mode
Diffstat (limited to 'blog/redirect-github-pages')
-rw-r--r--blog/redirect-github-pages/index.org120
1 files changed, 120 insertions, 0 deletions
diff --git a/blog/redirect-github-pages/index.org b/blog/redirect-github-pages/index.org
new file mode 100644
index 0000000..cae5928
--- /dev/null
+++ b/blog/redirect-github-pages/index.org
@@ -0,0 +1,120 @@
+#+title: Redirect GitHub Pages from Subdomain to the Top-Level Domain
+#+date: 2020-08-22
+#+description: Learn how to redirect Github pages to the TLD.
+#+filetags: :sysadmin:
+
+* Short answer
+** Step 1
+Add a new file CNAME to your GitHub Pages repository containing only one
+line: your top-level domain name. E.g.: =example.com=
+
+** Step 2
+[Optional] but highly recommended
+
+2.1: Remove all other top-level records (prefixed with @) of type A from
+your DNS configuration.
+
+2.2: Remove a CNAME record for the second-level domain www if it is
+present.
+
+** Step 3
+Add these 5 entries to the very top of your DNS configuration:
+
+#+begin_src txt
+@ A 185.199.108.153
+@ A 185.199.109.153
+@ A 185.199.110.153
+@ A 185.199.111.153
+www CNAME your_github_username.github.io.
+#+end_src
+
+Replace =your_github_username= with your actual GitHub username.
+
+** Step 4
+Wait for your DNS changes to propagate. DNS changes aren't effective
+immediately. They can take up to a full day to propagate.
+
+* Long answer
+This issue has two sides. One is the DNS configuration itself. Another
+one is the way GitHub Pages will forward HTTP requests.
+
+We need to know a few things to understand what GitHub is trying to say
+in their documentation.
+
+** DNS Entry Types
+There are two types of DNS records which interest us: CNAME and A.
+
+=A= is also known as =Apex= or sometimes as =root entry=. It forwards
+requests to a specified fixed IP address. =CNAME= entry forwards
+requests to a specified URL (actual valid plain text URL, not an IP
+address).
+
+** DNS Load balancing
+GitHub has one central URL address which accepts all DNS requests for
+GitHub Pages: =http://username.github.io=. That URL is resolved to
+different IP addresses based on your geographical location. Website
+hosted on GitHub Pages is a simple collection of =HTML=, =CSS= and =JS=
+files. GitHub distributes these files to different servers across the
+globe. So that when your browser sends a request from Europe, it
+receives data from a server in Europe. The same is valid for the
+requests from Asia and the USA.
+
+** What GitHub is trying to say
+Since =A= records in DNS must contain IP addresses, and they must be
+either =185.199.108.153= or =185.199.109.153= or =185.199.110.153= or
+=185.199.111.153=, there is no way to forward requests to a server
+located somewhere in Europe or Asia. Your website hosted at GitHub Pages
+will be downloaded from a central GitHub Pages server. There is a minor
+risk that if GitHub Pages DNS servers (=x.x.x.153=) are down for some
+reason, all custom domains which use fixed GitHub Pages IP addresses
+will not be accessible (their DNS requests will not be resolvable).
+
+That is why GitHub strongly suggests to either use a second-level domain
+for your GitHub Pages (e.g. =blog.example.com=) or use a DNS service
+provider that supports a record type =ALIAS= that acts as =A= record but
+forwards request to a URL address (e.g. =username.github.io=) instead of
+a fixed IP address.
+
+** How GitHub Pages treats HTTP requests
+After a DNS request for =your_github_username.github.io= is resolved
+into an IP address, e.g. =185.199.108.153= your browser sends an HTTP
+request to that server with an HTTP header =Host=. Below are =curl=
+examples that load the same website (these examples might not work if
+you are behind a proxy server):
+
+#+begin_src sh
+curl --header "Host: your_github_username.github.io" http://185.199.108.153/
+curl --header "Host: www.example.com" http://185.199.108.153/
+curl --header "Host: example.com" http://185.199.108.153/
+#+end_src
+
+This way GitHub Pages servers know which user website to serve.
+
+#+begin_quote
+GitHub Pages server will automatically redirect HTTP requests to the
+top-level domain if your =CNAME= file contains =example.com= but
+=www.example.com= is requested.
+
+The same is valid if your =CNAME= file contains =www.example.com= but
+the header =Host= in the =HTTP= request contains =example.com=.
+#+end_quote
+
+** Why can't I add a =CNAME= record entry that accepts a top-level request (=@=) to my DNS configuration?
+Quote from the GitHub Pages documentation:
+
+#+begin_quote
+Warning: Do not create a CNAME record for your custom apex domain! Doing
+so may cause issues with other services, such as email, on that domain.
+#+end_quote
+
+** References:
+1. [[https://docs.github.com/en/github/working-with-github-pages/configuring-a-custom-domain-for-your-github-pages-site][Setting
+ up a custom domain with GitHub Pages]]
+2. [[https://docs.github.com/en/github/working-with-github-pages/troubleshooting-custom-domains-and-github-pages][My
+ custom domain isn't working]]
+3. [[https://serverfault.com/questions/589370/cannot-access-my-github-pages-website-by-ip-address][Cannot
+ access my GitHub Pages website by IP Address]]
+4. [[https://stackoverflow.com/questions/23375422/how-do-i-set-up-github-pages-to-redirect-dns-requests-from-a-subdomain-e-g-www][How
+ do I set up GitHub Pages to redirect DNS requests from a subdomain
+ (e.g. www) to the top-level domain (TLD, Apex record)?]]
+