Nop Commerce автоматически перенаправляет на другой URL
У меня очень специфическая проблема. Для определенного URL-адреса веб-сайт перенаправляет на другой URL-адрес. Например -
Это URL, который должен идти -
когда щелкнул или даже вставил в адресную строку, я отладил код и в application_beginrequest
метод обратите внимание на URL -
(обратите внимание на свойство Path объекта Request)
Это автоматически изменилось с category_whisky-american-sour-mash
в shipping-and-returns
, Проверены оба URL-адреса SEO из категории и страницы, но без дубликатов.
Я проверил на SEO URL-адреса и есть только одна запись, поэтому нет возможности дублирования
Я пытаюсь решить эту проблему почти целый день. Кто-нибудь может помочь? Почему это происходит? Я относительно новичок в NopCommerce. Любое предложение приветствуется.
1 ответ
Ладно, после полутора дней попыток я наконец нашел исправление. Я думал, что я должен опубликовать решение здесь.
Это связано с неправильным Slug
ценности. в UrlRecordService
этот метод кэширует слизняк, помещая ""
если слизняк не найден -
public virtual string GetActiveSlug(int entityId, string entityName, int languageId)
{
if (_localizationSettings.LoadAllUrlRecordsOnStartup)
{
string key = string.Format(URLRECORD_ACTIVE_BY_ID_NAME_LANGUAGE_KEY, entityId, entityName, languageId);
return _cacheManager.Get(key, () =>
{
//load all records (we know they are cached)
var source = GetAllUrlRecordsCached();
var query = from ur in source
where ur.EntityId == entityId &&
ur.EntityName == entityName &&
ur.LanguageId == languageId &&
ur.IsActive
orderby ur.Id descending
select ur.Slug;
var slug = query.FirstOrDefault();
//little hack here. nulls aren't cacheable so set it to ""
if (slug == null)
slug = ""; //slug is blank for null
return slug;
});
}
else
{
//gradual loading
string key = string.Format(URLRECORD_ACTIVE_BY_ID_NAME_LANGUAGE_KEY, entityId, entityName, languageId);
return _cacheManager.Get(key, () =>
{
var source = _urlRecordRepository.Table;
var query = from ur in source
where ur.EntityId == entityId &&
ur.EntityName == entityName &&
ur.LanguageId == languageId &&
ur.IsActive
orderby ur.Id descending
select ur.Slug;
var slug = query.FirstOrDefault();
//little hack here. nulls aren't cacheable so set it to ""
if (slug == null)
slug = ""; // slug is blank for null
return slug;
});
}
}
Который заканчивается созданием большого количества URL с пустыми слизнями. Чтобы это исправить, вы должны сделать следующее -
- Сначала измените код, который преобразует слаг в элемент, чтобы он игнорировал пробелы - и
затем добавьте проверку, чтобы игнорировать слизняков с
isActive = False
-public virtual UrlRecordForCaching GetBySlugCached(string slug) { if (String.IsNullOrEmpty(slug)) return null; if (_localizationSettings.LoadAllUrlRecordsOnStartup) { //load all records (we know they are cached) var source = GetAllUrlRecordsCached(); var query = from ur in source where ur.Slug.Equals(slug, StringComparison.InvariantCultureIgnoreCase) && ur.IsActive // 2 add IsActive check select ur; var urlRecordForCaching = query.FirstOrDefault(); return urlRecordForCaching; } else { //gradual loading string key = string.Format(URLRECORD_BY_SLUG_KEY, slug); return _cacheManager.Get(key, () => { if (string.IsNullOrEmpty(slug)) // 1 blank slug check return null; var urlRecord = GetBySlug(slug); if (urlRecord == null) return null; var urlRecordForCaching = Map(urlRecord); return urlRecordForCaching; }); } } /// <summary> /// Gets all URL records /// </summary> /// <param name="slug">Slug</param> /// <param name="pageIndex">Page index</param> /// <param name="pageSize">Page size</param> /// <returns>Customer collection</returns> public virtual IPagedList<UrlRecord> GetAllUrlRecords(string slug, int pageIndex, int pageSize) { var query = _urlRecordRepository.Table; if (!String.IsNullOrWhiteSpace(slug)) query = query.Where(ur => ur.Slug.Contains(slug) && ur.IsActive); // 2 add IsActive check query = query.OrderBy(ur => ur.Slug); var urlRecords = new PagedList<UrlRecord>(query, pageIndex, pageSize); return urlRecords; } /// <summary> /// Find URL record /// </summary> /// <param name="slug">Slug</param> /// <returns>Found URL record</returns> public virtual UrlRecord GetBySlug(string slug) { if (String.IsNullOrEmpty(slug)) return null; var query = from ur in _urlRecordRepository.Table where ur.Slug == slug && ur.IsActive // 2 add IsActive check select ur; var urlRecord = query.FirstOrDefault(); return urlRecord; } protected virtual IList<UrlRecordForCaching> GetAllUrlRecordsCached() { //cache string key = string.Format(URLRECORD_ALL_KEY); return _cacheManager.Get(key, () => { var query = from ur in _urlRecordRepository.Table where ur.IsActive # 2 add IsActive check select ur; var urlRecords = query.ToList(); var list = new List<UrlRecordForCaching>(); foreach (var ur in urlRecords) { var urlRecordForCaching = Map(ur); list.Add(urlRecordForCaching); } return list; }); } /// <summary> /// Gets all cached URL records /// </summary> /// <returns>cached URL records</returns> protected virtual IList<UrlRecordForCaching> GetAllUrlRecordsCached() { //cache string key = string.Format(URLRECORD_ALL_KEY); return _cacheManager.Get(key, () => { var query = from ur in _urlRecordRepository.Table where ur.IsActive // 2 add isActive check select ur; var urlRecords = query.ToList(); var list = new List<UrlRecordForCaching>(); foreach (var ur in urlRecords) { var urlRecordForCaching = Map(ur); list.Add(urlRecordForCaching); } return list; }); }
Также не забудьте очистить cookie и перезагрузить сервер на всякий случай.
Итак, это решило мою проблему.