Tricky PHP regex sorunu

3 Cevap php

Belki bazıları için zor, ama benim için zor değil.

Geçenlerde benim blog şeyler dolaştı ve kolayca yeni sayfalara kullanıcıları yönlendirmek gerekir.

Daha önce, benim tüm makaleleri şöyle bağladı:

http://www.my-site.com/blog/my-article-title

Ama ben bunu değiştirdim:

http://www.my-site.com/blog/article/my-article-title

Ben "blog / my-yazı-başlığı" için "blog / haber / my-yazı-başlık" ziyaret eden kullanıcıları yönlendirmek istiyorum.

Zor kısmı ben URL'ler "blog / arşivler" veya "blog / search" olan arşiv ve arama gibi benim blog diğer bölümleri, olması. Zaten düşünce olabilir benim arşiv sayfası arıyor kullanıcılar "arşivler" olarak adlandırılan mevcut olmayan bir maddeye iletilir alamadım, bu yüzden akıllı bir çözüm gereklidir.

Herhangi bir yardım?

3 Cevap

. Bu iyi PHP daha da htaccess dosyasında yapılır; ve akla regex yaylar kullanırsanız iki sorunlarınız hakkında Jamie Zawinski ünlü alıntı. Sen. Htaccess ve PHP için tüm hiçbiri için en az regex gerekir.

RewriteCond $1 !^(archives|search)
RewriteRule blog/(.*) http://www.my-site.com/blog/article/$1 [R=301]

Eğer RedirectMatch kullanılabilir varsa Ya da, zaten önerilen negatif ileri yönlü ile birleştirebilirsiniz:

RedirectMatch permanent blog/((?!archives|search).+) http://www.my-site.com/blog/article/$1

PHP kullanmanız gerekiyorsa:

$urlparts = explode('/', $_SERVER['REQUEST_URI']);

if ( ! in_array($urlparts[1], array('archives', 'search')) ) {
    $url = 'http://www.my-site.com/blog/article/' . $urlparts[2]
    header('HTTP/1.1 301 Moved Permanently');
    header("Location: $url");
    exit;
}

Gördüğünüz gibi, PHP çok daha karmaşık ve aynı zamanda sunucu yapmış olabilir bir şey yapmak için bir tercüman başlatma gerektirir, bu yüzden seçenek varsa bu şekilde önlemek.

Bunun için php mod_rewrite (ya da web sunucuları eşdeğeri) kullanmak değil istiyorum.

Böyle bir olumsuz lookahead kullanabilirsiniz:

blog/((?!archives|search).+)