Diyelim ki bu web sayfam var: http://ww.xyz.com/Product.aspx?CategoryId=1
CategoryId = 1 adı "Köpekler" ise, URL'yi şunun gibi bir şeye dönüştürmek istiyorum: http://ww.xyz.com/Products/Dogs
Sorun, kategori adı yabancı (veya bir url için geçersiz) karakterler içeriyorsadır. CategoryId = 2 adı "Göra äldre" ise, yeni URL ne olmalıdır?
Mantıksal olarak şöyle olmalıdır: http://ww.xyz.com/Products/Göra äldre
ama işe yaramayacak.
Öncelikle boşluk nedeniyle (örneğin bir tire ile kolayca değiştirebilirim) fakat yabancı karakterlerden ne haber? Asp.net'te şöyle bir şey verecek olan URLEncode işlevini kullanabilirim: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre
ama gerçekten orijinal URL'den (http://ww.xyz.com/Product.aspx?CategoryId=2
) daha iyi olduğunu söyleyemem.
İdeal olarak bunu oluşturmak isterdim ama bunu otomatik olarak nasıl yapabilirim (yani yabancı karakterleri 'güvenli' URL karakterlerine dönüştürür): http://ww.xyz.com/Products/Gora-aldre
.
2 aşağıdaki uzatma yöntemlerini buldum (asp.net/C #):
public static string RemoveAccent(this string txt)
{
byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt);
return System.Text.Encoding.ASCII.GetString(bytes);
}
public static string Slugify(this string phrase)
{
string str = phrase.RemoveAccent().ToLower();
str = System.Text.RegularExpressions.Regex.Replace(str, @"[^a-z0-9\s-]", ""); // Remove all non valid chars
str = System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space
str = System.Text.RegularExpressions.Regex.Replace(str, @"\s", "-"); // //Replace spaces by dashes
return str;
}
Kullandığınız dile ve kullanmak istediğiniz tekniğe bağlıdır. Bu JavaScript kod parçasına Django kaynağından bakın, tam olarak ihtiyacınız olanı yapar. Sanırım, seçtiğiniz dile kolayca yönlendirebilirsiniz.
Bu, Python slugify işlevinde kullanılan Django snippet, bu çok daha kısa:
def slugify(value):
"""
Normalizes string, converts to lowercase, removes non-alpha characters,
and converts spaces to hyphens.
"""
import unicodedata
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
return re.sub('[-\s]+', '-', value)
Her dilin bunun bir limanı olduğunu düşünüyorum, çünkü bu yaygın bir problem. Sadece Google slugify + dilinizi.
Her ürün için URL güvenli ve benzersiz bir ad içeren Ürünler tablosuna yeni bir alan ekleyebilirsiniz. Bu muhtemelen başlangıçta otomatik olarak oluşturulabilir (güvenli olmayan karakterlerin en yakın güvenli eşdeğeri - gora-aldre
? İle değiştirilmesi) ve ardından gerektiği gibi ince ayar yapılabilir.
Güvenli olmayan karakterlerin değiştirilmesi (her zaman) geri dönüşümlü olmadığından, bu tür şeyleri anında yapmak tamamen mümkün değildir.
Alternatif olarak, URL'yi bu şekilde oluşturursunuz:
http://example.com/products/1234/safe-string
Güvenli olmayan karakterlerin gerektiği gibi değiştirilmesiyle anında safe-string
oluşturulduğu yer. 1234
numarası ürün anahtarıdır. Ürünü aramak için anahtarı kullanırsınız, 'güvenli dizge' kullanıcı ve arama motorları için daha fazladır.
Akılda tutulması gereken iki şey:
URL yeniden yazma genellikle arama motorları üzerinde olumlu bir etkiye sahip değildir (ve genellikle olumsuz olanı da) - bu nedenle, yalnızca kullanıcı memnuniyeti üzerinde ölçülebilir bir pozitif etki olduğunu biliyorsanız (ve buna göre: URL’lerinizi kullanıcılar için yararlı kılar) .
URL yeniden yazma yapmaya karar verirseniz, teknik detaylarınızı mükemmel bir şekilde öğrenmelisiniz . Örneğin, aynı içeriği gösteren hiçbir zaman birden fazla benzersiz URL'niz olmamalıdır. ASCII olmayan içeriğin kodlanması için UTF-8 kullandığınızdan, içeriğinizdeki kaçan bağlantıları kullandığınızdan ve genellikle planlanan şekilde çalıştığından emin olmak için çeşitli tarayıcıları test ettiğinizden emin olun. Bunlardan herhangi biri size yabancıysa, şu an için URL'yi yeniden yazmamanızı şiddetle tavsiye ederim.
FWIW Arama motoru yan sorunlarından bazıları http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html adresinde ele alınmıştır.
IMO'nun en iyi yöntemi, geçersiz karakterler aramaya çalışmak yerine beyaz liste karakterleri kullanmaktır. Ancak, é gibi aksanlı karakterler oldukça yaygındır (ve URL’niz onlarsız tuhaf olacaktır), böylece ilk önce bunları dönüştürebilirsiniz.
PHP içinde strtr
işlevini kullanabilirsiniz, ancak asp.net'deki ihtiyaçlarınız için bunu değiştirebilmelisiniz:
strtr(
'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ',
'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr'
);
Şimdi işte işleminiz:
Gönderdiğiniz ASP.Net etiketli olduğundan: bu siteye bakın , (çoğu) metnin yerine diacritics (onları çağırdığınız geçersiz karakterler) karakterlerini temel karakterleriyle değiştirmek için örnek kod içerir.
Kris'in dediği gibi, bu sitenin yaptığı gibi, URL'nizde benzersiz bir kimlik kullanın. Size verilen kimliği kontrol edemiyorsanız, harici kimliği ile birlikte benzersiz kimliğinizi içeren bir çeviri tablosu oluşturmalısınız. Bu şekilde, dahili ID'niz değiştiğinde dahili referanslarınız da iyidir. Eşsiz kimliğinizle birlikte, çok benzersiz olmayan, ancak iyi görünen "Arama ve İnsan için optimize edilmiş kimliğinizi" kaydedersiniz.
Wikipedia genellikle latin1 olmayan karakterleri URL'lerinde kullanır. Bu URL'leri kullanmamanız için hiçbir neden yoktur (web sunucunuzun ötesinde onları desteklemiyorsanız).
Ancak; Eğer bu karakterlerden kaçınmanız gerekiyorsa, onları onların yerine - diacritic formları ile değiştirdim Bunları okuyan çoğu insan, diakritikler kaldırılsa bile, Kelimenin ne olması gerektiğini (bağlamdan) söyleyebilir.