Web Performansı: Hız, SEO, Güvenlik

WordPress HTTP→HTTPS Zorunlu Yönlendirme: HSTS Dahil Eksiksiz Rehber (2025)

WordPress sitenizi kalıcı olarak HTTPS’ye taşıyın: tüm HTTP isteklerini 301 ile yönlendirin, HSTS (gerekirse preload) ile tarayıcı seviyesinde güvenliği sağlayın. Apache (.htaccess), Nginx, Cloudflare, IIS ve reverse proxy senaryoları ile karışık içerik (mixed content) temizliği, SEO ve test adımlarını tek bir kapsamlı rehberde toplayın.

WordPress HTTP→HTTPS Zorunlu Yönlendirme: HSTS Dahil Eksiksiz Rehber (2025)

WordPress HTTP→HTTPS Zorunlu Yönlendirme: 301 yönlendirme, HSTS (preload), .htaccess/Nginx/Cloudflare ayarları ve mixed content temizliği için aşağıdaki adımları sırasıyla doğru şekilde uygulayınız.

Neden HTTPS ve 301 zorunlu yönlendirme?

HTTPS, yalnızca veriyi şifrelemekle kalmaz; modern tarayıcılar ve arama motorları tarafından bir standart olarak kabul edilir. Tüm http:// isteklerini kalıcı 301 ile https:// sürüme yönlendirmek, tekil adres (canonical) disiplinini sağlar, yetkisiz trafik manipülasyonunu engeller, kullanıcı güvenini artırır ve SEO sinyallerinin konsolide olmasına yardımcı olur. 2025’te Chrome, Firefox ve Safari; güvenli olmayan sayfalarda uyarıları belirginleştirirken, HSTS etkin sitelerde tarayıcı ilk andan itibaren HTTPS’e zorlar.

Hazırlık: Sertifika, yedek, URL ve ortam analizi

  • Sertifika: Üretimde Full (strict) doğrulamalı bir TLS sertifikası (ör. Let’s Encrypt DV veya ücretli) kullanın. Geçerlilik süresi ve otomatik yenileme (cron) yapılandırılsın.
  • Yedek: Dosya ve veritabanı yedeğini alın. Canlıya geçiş öncesi staging ortamında deneyin.
  • URL’ler: siteurl ve home değerlerinizin HTTPS olması gerekir. Hard-coded http:// bağlantıları tespit edin.
  • Önbellek/CDN: CDN/proxy katmanlarını (Cloudflare, Nginx proxy, Load Balancer) not alın; başlıkları ve yönlendirmeyi nerede vereceğinizi netleştirin.

WordPress tarafı: wp-config.php ve yönetim paneli

Yönetim arayüzüne her zaman HTTPS ile erişmeyi zorlamak için:

/** Yalnızca HTTPS üzerinden admin */ define('FORCE_SSL_ADMIN', true);

/** (Opsiyonel) Sabitleme: domaininizi yazın */
// define(‘WP_HOME’, ‘https://example.com’);
// define(‘WP_SITEURL’, ‘https://example.com’);

Not: WP_HOME/WP_SITEURL sabitlemesi, yanlış alan adında kilitlenmeye yol açabilir. Üretim alan adı değişecekse önce veritabanındaki siteurl/home değerlerini düzeltin.

WordPress HTTP→HTTPS Zorunlu Yönlendirme
WordPress HTTP→HTTPS Zorunlu Yönlendirme

Apache (.htaccess) ile HTTP→HTTPS 301 yönlendirme

WordPress’in varsayılan Rewrite bloklarının üstüne (veya en başına) aşağıdaki kuralı ekleyin. Reverse proxy (örn. X-Forwarded-Proto) arkasındaki senaryolar da kapsanır.

<IfModule mod_headers.c>   # --- Core Security Headers ---   Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS   Header always set X-Content-Type-Options "nosniff"   Header always set Referrer-Policy "strict-origin-when-cross-origin"   Header always set X-Frame-Options "SAMEORIGIN"   Header always set Cross-Origin-Opener-Policy "same-origin"   Header always set Cross-Origin-Resource-Policy "same-origin"   # Minimal Permissions-Policy to avoid breaking embeds   Header always set Permissions-Policy "fullscreen=(self)"      # --- Content-Security-Policy (compatibility-first, very permissive; NO 'prefetch-src') ---   Header always set Content-Security-Policy "\     upgrade-insecure-requests; \     default-src 'self'; \     base-uri 'self'; \     frame-ancestors 'self'; \     object-src 'none'; \     script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data: blob:; \     style-src 'self' 'unsafe-inline' https: data:; \     img-src 'self' https: data: blob:; \     font-src 'self' https: data:; \     connect-src 'self' https: wss:; \     media-src 'self' https: data:; \     worker-src 'self' blob:; \     child-src 'self' blob: https:; \     frame-src 'self' https:; \     form-action 'self' https: \   "      # Test safely first (optional):   # Header always set Content-Security-Policy-Report-Only "\   #  upgrade-insecure-requests; default-src 'self'; base-uri 'self'; frame-ancestors 'self'; object-src 'none'; \   #  script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data: blob:; style-src 'self' 'unsafe-inline' https: data:; \   #  img-src 'self' https: data: blob:; font-src 'self' https: data:; connect-src 'self' https: wss:; \   #  media-src 'self' https: data:; worker-src 'self' blob:; child-src 'self' blob: https:; frame-src 'self' https:; \   #  form-action 'self' https:   # " </IfModule>

# (Opsiyonel) www → kök domain (örnek)
# <IfModule mod_rewrite.c>
# RewriteEngine On
# RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
# RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]
# </IfModule>

# HSTS başlığı (aktif etmeden önce yönlendirmelerin kusursuz çalıştığından emin olun)
<IfModule mod_headers.c>
Header always set Strict-Transport-Security “max-age=31536000; includeSubDomains; preload”
</IfModule>

Nginx ile HTTP→HTTPS 301 yönlendirme

# 80 → 443 yönlendirme server { listen 80; server_name example.com www.example.com; return 301 https://example.com$request_uri; }

# HTTPS sunucu bloğu
server {
listen 443 ssl http2;
server_name example.com;

# HSTS (hazır olduğunuzda açın)
add_header Strict-Transport-Security “max-age=31536000; includeSubDomains; preload” always;

root /var/www/html;
index index.php;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
}

Reverse proxy arkasında iseniz, istemci protokolünü başlıktan okuyup 301 vermek için $http_x_forwarded_proto değerini kontrol edin. (Proxy’de de zorunlu yönlendirme yapmanız önerilir.)

Cloudflare/CDN üzerinde HTTPS zorlaması ve başlıklar

  • SSL/TLS: “Full (strict)” modunu seçin; orijin sertifikanız geçerli olmalı.
  • Yönlendirme: “Redirect Rules” ile http → https kalıcı (301) yönlendirme tanımlayın.
  • HSTS: SSL/TLS > Edge Certificates bölümünden HSTS’yi etkinleştirebilir, includeSubDomains ve preload seçeneklerini dikkatle açabilirsiniz.
  • Header Enjeksiyonu: Transform/WAF kuralları ile HSTS ve Content-Security-Policy başlıklarını kenarda (edge) set edebilirsiniz.

IIS (web.config) örneği

<configuration> <system.webServer> <rewrite> <rules> <rule name="HTTP to HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" /> </customHeaders> </httpProtocol> </system.webServer> </configuration>

HSTS (Strict-Transport-Security) ve preload notları

HSTS, tarayıcıya “bu alan adı her zaman HTTPS ile açılmalı” talimatını veren bir güvenlik başlığıdır. Örnek:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

  • max-age: Saniye cinsinden geçerlilik (1 yıl = 31536000).
  • includeSubDomains: Tüm alt alan adlarını da zorlar (hepsi HTTPS almak zorunda).
  • preload: Tarayıcıların yerleşik HSTS listesine (preload) dahil olmayı talep eder. Geri dönüşü zordur; tüm alt alanlarınızın kalıcı olarak HTTPS verdiğinden emin değilseniz preload kullanmayın.

Güvenli akış: Önce http→https 301 yönlendirmeleriniz kusursuz çalışsın; karışık içerikleri temizleyin. Ardından HSTS’yi max-age=300 gibi düşük bir değerle test edin, sorun yoksa 6 ay/1 yıla yükseltin. Preload’a başvurmadan includeSubDomains etkisini üretimde doğrulayın.

Karışık içerik (Mixed Content) temizliği

  • Veritabanı düzenleme: Alan adınız için global arama-değiştirme yapın. WP-CLI ile:
    wp search-replace ‘http://example.com’ ‘https://example.com’ –all-tables –precise –report-changed-only
    Seri hale getirilmiş (serialized) veriler için WP-CLI güvenlidir; doğrudan SQL ile yapmayın.
  • Tema/Eklenti çağrıları: enqueue edilen CSS/JS ve sabit görsel URL’lerini HTTPS’e taşıyın. Protokol bağımsız şema (//) yerine doğrudan https:// tercih edin.
  • Dış kaynaklar: HTTP veren üçüncü tarafları HTTPS muadilleriyle değiştirin; yoksa kaldırın. Geçici olarak upgrade-insecure-requests deneyebilirsiniz:
    Content-Security-Policy: upgrade-insecure-requests
    Ancak erişilemeyen HTTP kaynaklar kaybolabilir; test ederek ilerleyin.
  • Eklentiler: “Really Simple SSL” gibi eklentiler geçişi hızlandırır fakat kalıcı çözüm, kod ve içerik düzeyinde HTTPS’e taşımaktır.

SEO etkileri: Canonical, Sitemap, Search Console

  • 301 kalıcı olmalı: 302/307 kullanmayın; sinyaller kalıcı 301 ile daha sağlıklı aktarılır.
  • Canonical: Tema/SEO eklentinizin rel=”canonical” çıktılarının HTTPS olduğunu doğrulayın.
  • Sitemap/Robots: XML sitemap’ler ve robots.txt içindeki tüm URL’ler HTTPS olsun; Search Console’a HTTPS mülkü ekleyip sitemap’i yeniden gönderin.
  • Döngü ve zincirlerden kaçının: http → https → www → non-www gibi birden fazla sıçrama yerine tek adımda hedefe yönlendirin.
  • Analytics/Ads: Takip kodlarınızı HTTPS ile çağırın; referral kaybını önleyin.

Test ve doğrulama: Header, redirect, güvenlik

  • curl ile başlık kontrolü:
    curl -I http://example.com
    curl -I https://example.com

    HTTP isteği 301 ile HTTPS’e gitmeli; HTTPS yanıtında Strict-Transport-Security görünmeli.
  • Redirect test: httpstatus.io gibi araçlarla tüm önemli sayfalarda tek sıçrama (1 hop) doğrulayın.
  • Sertifika ve protokol: SSL Labs testi ile sertifika zinciri, TLS sürümleri ve zayıf şifre kümelerini kontrol edin.

Sık yapılan hatalar ve sorun giderme

  • Önce HSTS, sonra yönlendirme: Bu sırayı ters yapmak kilitlenmelere yol açabilir. Daima önce 301, sonra HSTS.
  • Alt alanlar: includeSubDomains açıkken tek bir HTTP subdomain bile sorun çıkarır. Hepsini HTTPS’e alın ya da bu seçeneği kapalı tutun.
  • Proxy çakışmaları: Hem edge hem origin’de yönlendirme kuralı varsa iki kez yönlendirme (veya döngü) oluşabilir; tek bir katmanda standardize edin.
  • Hard-coded içerik: Tema dosyalarında sabit http:// kalmışsa karışık içerik uyarıları bitmez. Kod taraması yapın.

Sonuç ve kontrol listesi

WordPress’te HTTPS geçişinin ideal yolu:
(1) yedek al,
(2) URL’leri HTTPS’e çevir,
(3) HTTP→HTTPS 301’i sunucu/CDN katmanında tek adımda uygula,
(4) karışık içeriği temizle,
(5) HSTS’yi kademeli olarak devreye al (gerekirse preload),
(6) sitemap/robots/canonical/SC güncellemelerini yap,
(7) testlerle doğrula. Bu adımlarla 2025 standartlarında güvenli, hızlı ve arama motoru dostu bir yapı elde edersiniz.

Yorum Yap

Yorumlar

  1. İlk yorumu siz yazın.