2013-05-14 5 views
5

/DEx.html/SEO amaçları için yeniden yazmak/(yinelenen içerik için index.html ile karıştırılan ve yinelenen içerik için ceza alan aptal arama motorları) - ayrıca web analizi verilerini uzlaştırmak için .nginx /index.html için/rewrite

Stackoverflow, nginx belgeleri vb. Üzerinde bulduğum her çözümü denedim ve hiç başarı elde edemedim. Sanırım başka bir yapılandırma sorunum veya acı bir şekilde açık bir şey olmalı. Bu benim ilk nginx kurulumudur - Apache ve IIS için kullanılır! İşte

benim default.conf: İşte
server { 
    listen  80; 
    server_name web.local; 
    #charset koi8-r; 
    #access_log /var/log/nginx/log/host.access.log main; 

    #error_page 404    /404.html; 

    # redirect server error pages to the static page /50x.html 
    # 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /var/www/html; 
    } 

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80 
    # 
    #location ~ \.php$ { 
    # proxy_pass http://127.0.0.1; 
    #} 

benim virtual.conf olan (bölüm benim en son girişimdi dışarı yorumladı - uncommented zaman bir 301 www erişmeye çalıştığınızda hata Kalıcı Olarak Taşındı verir .domain.com/index.html):

server { 
    listen  80; 
    server_name www.domain.com; 

    location/{ 
     root /var/www/html/domain.com; 
     index index.html; 
     #if ($request_uri = /index.html) { 
     # rewrite^http://www.domain.com permanent; 
     #} 
    } 
} 

server { 
    listen 80; 
    server_name domain.com; 
    rewrite ^/(.*) http://www.domain.com/$1 permanent; 
    } 

HTTP Cevap cobaco en çözümü için:

URL: 
http://www.domain.com 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://domain.com/ 

Redirecting URL: 
http://domain.com/ 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://www.domain.com/ 

Bu satırın sorunlara neden olabileceğini düşündüm: "location = /index.html {return 301 $ scheme: //domain.com/;}" böylece www ekledim. "scheme: //" ifadesinden sonra - bunun yapılabilecek kötü bir şey olup olmadığını bana bildirin! Bu şu HTTP Cevap Başlıklarındaki sonuçlandı: Biraz daha müdahalesi sonrasında

URL: 
http://www.domain.com 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://www.domain.com/ 

Redirecting URL: 
http://www.domain.com/ 
http/1.1 301 moved permanently 
server: nginx/1.2.8 
date: Thu, 16 May 2013 01:42:58 GMT 
content-type: text/html 
content-length: 184 
connection: keep-alive 
location: http://www.domain.com/ 

, aşağıdaki yapılandırma bunu yapmak istiyorum fakat eğer açıklamaya ideal değildir yapar. Baska öneri? Eğer sonra bazı bukle uygulaması yazıyorsanız

server { 
    server_name www.domain.com; 
    root /var/www/html/domain.com; 
    index index.html; 
    if ($request_uri = /index.html) { 
     return 301 http://www.domain.com/; 
    } 
    #location = /index.html { 
    # return 301 $scheme://www.domain.com/; 
    #} 
} 

server { 
    listen 80; 
    server_name domain.com; 
    return 301 $scheme://www.domain.com$request_uri; 
} 

cevap

4

Son çözüm tamamen iyi.

if yönergesi kötülük SADECE location bloğunun içinde ise. Ayrıca sadece if bloğunun içinde bir return direktifiniz var. Bununla ilgili yanlış bir şey göremiyorum. Referans:

index index.html; 

konum maçın başka yuvarlak tetikler çünkü cobaco en çözeltide http://wiki.nginx.org/IfIsEvil

sonsuz yönlendirme döngü. Böylece nginx http://www.domain.com/'a yeniden yönlendirildikten sonra tekrar location = /index.html'a sıkıştı.

+0

teşekkürler, iyi çalışıyor! :) – auralsun

0

301 O yeni hedefe yönlendirmesi gerekir tarayıcıyı söylüyorum sadece bir başlık var, gerçekten bir hata değildir, web tarayıcıları otomatik olarak ve sessizce bu başlıkları ele fakat Bu başlıklara saygı duymak ve işlemek için talimat vermelisiniz.Eğer konfigürasyonda permanent yazma çünkü Ve 301 var, 302 temporary

i benimle çalıştı senin yeniden yazma çalıştı, ama ben

location = /index.html { 
    return 301 $scheme://$host; 
} 

da bunu dışı yönlendirme sunucusunda yerine yeniden yazma dönüşünü kullanılan siz de

server { 
    server_name domain.com; 
    return 301 $scheme://www.domain.com$request_uri; 
} 

DÜZENLEMEYİ dönmek kullanmak için yönlendirme sunucusu değiştirirseniz daha iyi olurdu: @cobaco önerdi gibi ben s cevapsız neden bilmiyorum, yer bloğuna eğer blok değişti Ne istediğinizi aşağıdaki yapacak

2

aptalca bir hata uch:

server { 
    server_name www.domain.com; 
    root /var/www/html/domain.com; 
    index index.html; 
    location = /index.html {return 301 $scheme://www.domain.com/;} 
} 

server { 
    listen 80; 
    server_name domain.com; 
    return 301 $scheme://www.domain.com$request_uri; 
} 

not için:

  • (bir location içine if bilindiğinden Mümkün olduğunda if yerine location blok kullanmak neden sorunlara bakın
  • return kullanmak rewrite 301 için
  • root ve index direktifleri normal olarak her zaman server ana seviyede olmalıdır (daha verimli yöntem olduğu yerleşik değişkenlerin bir listesi için http://wiki.nginx.org/HttpCoreModule#Variables bakınız) yerine regex eşleştirme yerleşik değişkenler kullanmak (daha verimlidir gibi) -block (her bir alt-blok için bunları tekrarlamanız gerekir)
+1

Teşekkürler! Ben senin çözümünü uyguladı ve mantığı takip ettiğimi düşünürüm, ama bir nedenden dolayı bunu kullanarak sonsuz bir yönlendirme alıyorum ve temelde denediğim her diğer (meşru ama muhtemelen daha az verimli) yönlendirme yöntemini alıyorum. Önerilerimin sonuçta ortaya koyduğu HTTP yanıtlarını OP'imde yayınladım, çünkü biçimlendirmeler yorumlarda imkansız görünüyor. – auralsun