Nasıl mod_rewrite kullanarak SEO dostu URL'ler görüntüleyebilir?

3 Cevap php

Ben kalbinde bir PHP geliştiricisi değilim ve varolan PHP web sitesinde bazı SEO gerçekleştirmek istendi.

Ben fark ilk şey, bu yüzden bu daha bilgilendirici şey yeniden almak istiyorum çirkin URL'ler oldu. İşte tüm olası desenleri:

/index.php?m=ModuleType&categoryID=id
/index.php?m=ModuleType&categoryID=id&productID=id
/index.php?page=PageType
/index.php?page=PageType&detail=yes

Yani temelde yapmak istiyorum ne gibi bir şey bu dönüştürmek olduğunu:

/ModuleType/Category
/ModuleType/Category/ProductName
/Page
/Page

Herhangi bir tavsiye veya örnekler harika olurdu önce mod_rewrite'ın kullanılmış değil!

Teşekkürler.

3 Cevap

mod_rewrite yerine tersini yapmak için kullanılan olurdu: /ModuleType/Category/ProductName dahili olarak isteklerini yeniden /index.php?m=ModuleType&categoryID=id&productID=id. Belgelerde yeni URL'leri kullanarak uygulama işidir.


Edit İşte bir fonksiyonu olduğunu yenilerini içine parametreli URL'leri döner gibi görünebilir nasıl bir örnek:

function url($url, $rules) {
    $url = parse_url($url);
    parse_str($url['query'], $url['query']);
    $argNames = array_keys($url['query']);
    foreach ($rules as $rule) {
        if ($rule[0] == $url['path'] && array_keys($rule[1]) == $argNames) {
            $newUrl = $rule[2];
            foreach ($rule[1] as $name => $pattern) {
                if (!preg_match('/'.addcslashes($pattern, '/').'/', $url['query'][$name], $match)) {
                    continue 2;
                }
                $newUrl = str_replace('<'.$name.'>', $match[0], $newUrl);
            }
            return $newUrl;
        }
    }
    return $url;
}

$rules = array(
    array(
        '/index.php',
        array('m'=>'.*', 'categoryID'=>'.*', 'productID'=>'.*'),
        '/<m>/<categoryID>/<productID>'
    )
);
echo '<a href="' . url('/index.php?m=ModuleType&categoryID=categoryID&productID=productID', $rules) . '">/ModuleType/Category/ProductName</a>';

Ben hiçbir şekilde bir mod_rewrite uzmanı değilim, ama bu Resim Flair site için htaccess araya nasıl bir örnektir.:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)\.png$ imageFlair.php?mode=$1&userid=$2 [L]
RewriteRule ^(.*)\.png$ imageFlair.php?userid=$1 [L]
</IfModule>

Bu temelde eşler:

MODE/USERID.png -> imageFlair.php?mode=MODE&userid=USERID

ve

USERID.png -> imageFlair.php?userid=USERID

Siz ihtiyaçlarınıza o adapte olmalı, ama sorunları bir çift olabilir:

  1. Eğer URL "adları" yerine kimlikleri kullanmak istiyorsanız isimlerini kabul etmek PHP değiştirmek gerekir.
  2. You might have an issue with /Page ve/ModuleType conflicting, if you wanted to also include more parameters in with Page, unless you can put together a regex that can determine which is which.

Ben :-) bunu yapmak için en iyi ya da tek yol olduğunu iddia olmasa da istediğiniz URL'lerin listesinde gidiyor, bu çalışması gerekir

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(.*)/(.*)$ index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^(.*)/(.*)$ index.php?m=$1&categoryID=$2 [L]
RewriteRule ^(.*)$ index.php?Page=$1 [L]
</IfModule>

As suggested, you may want to replace the .* with [^/]+ but I had issues with non-matches when I did that, vehad no time to troubleshoot, so YMMV :-)

Bu değişkenlerin ne yazınızın oldukça net değil. Ama ModuleType, id (x2) ve Page tüm değişkenler sonra Geribaşvurularda ile aşağıdaki kurallar bir .htaccess dosya içinde çalışması gerektiğini varsayarak .

RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /index.php?m=$1&categoryID=$2&productID=$3 [L]
RewriteRule ^([^/]+)$ /index.php?page=PageType [L]
RewriteRule ^([^/]+)/detail$ /index.php?page=PageType&detail=yes [L]

Bunu yazdık sonuncusu gerçekten mantıklı değildi. Peki yerine ne ucunda /detail ekleyebilirsiniz.

Bu uygulama için herhangi bir değişiklik yapmadan düz mevcut uygulamaların üstünden kayma gerekir. Onlar ile yönlendirme olmadığı için [R] sizin kullanıcılara şeffaf olacak.