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.

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.
İlk yorumu siz yazın.