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 с пустыми слизнями. Чтобы это исправить, вы должны сделать следующее -

  1. Сначала измените код, который преобразует слаг в элемент, чтобы он игнорировал пробелы - и
  2. затем добавьте проверку, чтобы игнорировать слизняков с 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;
        });
    }
    
  3. Также не забудьте очистить cookie и перезагрузить сервер на всякий случай.

Итак, это решило мою проблему.

Другие вопросы по тегам