Добавить текст в URL вместо int ID - PullRequest
0 голосов
/ 19 мая 2018

В настоящее время наши постоянные ссылки не верны и препятствуют поиску, например, https://example.com/en/blogs/19 - в URL должны быть слова, которые Google может найти в поиске, вместо int id, который используется для получения из базы данных.

Допустим, статья для Google «Последние новости автомобильной промышленности» даст больший вес алгоритму, если бы у нас была возможность редактировать ссылку, включающую ключевые слова.Например: https://example.com/en/blogs/news/The_Automotive_Industry_Latest - эта ссылка должна указывать на https://example.com/en/blogs/19

. Я могу сделать это, используя следующее - но так ли это можно сделать?

[Route("en/blogs")]
public class BlogController : Controller
{
    [HttpGet("{id}")]
    [AllowAnonymous]
    public IActionResult GetId([FromRoute] int id)
    {
        var blog = _context.Blogs.Where(b => b.Id == id);

        return Json(blog);
    }

    [HttpGet("{text}")]
    [AllowAnonymous]
    public IActionResult GetText([FromRoute] string text)
    {
        var blog = _context.Blogs.Where(b => b.Title.Contains(text));

        if(blog != null)
            GetId(blog.Id)

        return Ok();
    }
}

I 'Я предполагаю, что это все еще не будет проиндексировано в Google как текст, так что должно быть сделано через sitemap.xml?Это должно быть общим требованием, но я не могу найти какую-либо документацию по нему.

Мне известно о перезаписи URL IIS, но я хотел бы избежать этого, если это возможно.

1 Ответ

0 голосов
/ 19 мая 2018

Ссылка Маршрутизация в ASP.NET Core

Вы можете использовать символ * в качестве префикса для параметра маршрута для привязки к остальной части URI - этоназывается параметром catch-all .Например, blog/{*slug} будет соответствовать любому URI, который начинается с /blog и имеет любое значение после него (которое будет назначено значению маршрута slug).Параметры Catch-all также могут соответствовать пустой строке.

Ссылка Маршрутизация к действиям контроллера в ASP.NET Core

Вы можете применить ограничения маршрута, чтобы убедиться, чточто id и заголовок не конфликтуют друг с другом, чтобы получить желаемое поведение.

[Route("en/blogs")]
public class BlogController : Controller {
    //Match GET en/blogs/19
    //Match GET en/blogs/19/the-automotive-industry-latest
    [HttpGet("{id:long}/{*slug?}",  Name = "blogs_endpoint")]
    [AllowAnonymous]
    public IActionResult GetBlog(long id, string slug = null) {
        var blog = _context.Blogs.FirstOrDefault(b => b.Id == id);

        if(blog == null)
            return NotFound();

        //TODO: verify title and redirect if they do not match
        if(!string.Equals(blog.slug, slug, StringComparison.InvariantCultureIgnoreCase)) {
            slug = blog.slug; //reset the correct slug/title
            return RedirectToRoute("blogs_endpoint",  new { id = id, slug = slug });
        }

        return Json(blog);
    }
}

Это следует той же схеме, что и StackOverflow для своих ссылок

questions/50425902/add-text-to-urls-instead-of-int-id

Тактеперь ваши ссылки могут включать в себя слова, удобные для поиска, которые должны помочь с ссылками на нужные статьи

GET en/blogs/19
GET en/blogs/19/The-Automotive-Industry-Latest.

Я бы предложил создать слаг в качестве поля / свойства на основе заголовка блога при сохранении блога в базе данных,убедившись, что санируйте заголовок полученного заголовка любых недопустимых символов URL.

...