Nop Commerce 自动重定向到不同 URL
Nop Commerce automatically redirecting to different URL
我有一个非常特殊的问题。对于某些特定的 url nop 网站重定向到另一个 url。例如-
这是应该去的 url -
在地址栏中单击甚至粘贴时,我调试了代码并在 application_beginrequest
方法中注意到 url -
(注意 Request 对象的 Path 属性)
它自动从 category_whisky-american-sour-mash
更改为 shipping-and-returns
。检查了类别和页面中的 SEO url,但没有重复项。
我检查了 SEO urls 并且只有一个条目,所以没有可能的复制方式
我已经花了将近一天的时间来解决这个问题。有人可以帮忙吗?为什么会这样?我对 NopCommerce 比较陌生。任何建议表示赞赏。
好的,经过一天半的尝试,我终于找到了修复方法。我想我应该post这里的解决方案。
这是由于错误的 Slug
值。在 UrlRecordService
中,如果未找到 slug -
,则此方法通过放置 ""
来缓存 slug
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;
});
}
}
最后创建了很多带有空白 slug 的 url。要解决此问题,您应该执行以下操作 -
- 首先修改将 slug 转换为 item 的代码,使其忽略空格 -
和
然后添加检查以忽略带有 isActive = False
-
的 slug
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 并重启服务器以防万一。
到目前为止,这已经解决了我的问题。
我有一个非常特殊的问题。对于某些特定的 url nop 网站重定向到另一个 url。例如-
这是应该去的 url -
在地址栏中单击甚至粘贴时,我调试了代码并在 application_beginrequest
方法中注意到 url -
它自动从 category_whisky-american-sour-mash
更改为 shipping-and-returns
。检查了类别和页面中的 SEO url,但没有重复项。
我检查了 SEO urls 并且只有一个条目,所以没有可能的复制方式
我已经花了将近一天的时间来解决这个问题。有人可以帮忙吗?为什么会这样?我对 NopCommerce 比较陌生。任何建议表示赞赏。
好的,经过一天半的尝试,我终于找到了修复方法。我想我应该post这里的解决方案。
这是由于错误的 Slug
值。在 UrlRecordService
中,如果未找到 slug -
""
来缓存 slug
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;
});
}
}
最后创建了很多带有空白 slug 的 url。要解决此问题,您应该执行以下操作 -
- 首先修改将 slug 转换为 item 的代码,使其忽略空格 - 和
然后添加检查以忽略带有
的 slugisActive = 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 并重启服务器以防万一。
到目前为止,这已经解决了我的问题。