# لماذا لم تجد هذا على جوجل (وكيف أصلحته)

<!--category-- ASP.NET Core, SEO -->
<datetime class="hidden">2025-11-26T14:00</datetime>

أنا أدير هذه المدونة منذ فترة، أكتب مقالات تقنية مفصلة عن ASP.NET orre, constem Frame, HTMX, وجميع أنواع الـ NET good. ومع ذلك فإن تصنيفات بحثي كانت...

[TOC]

# المشكلة: كل صفحة تبدو متطابقة لـ جوجل

عندما يزحف جوجل موقعك، فإنه ينظر إلى عدة إشارات رئيسية لفهم ما هو كل صفحة. كنت أرسل جوجل نفس الإشارات لكل صفحة.

## الموضوع الذي يُدخَّن فيه: وصف ثابت للميتا

هذا هو ما `_Layout.cshtml` مثل:

```html
<meta name="description" content="Scott Galloway is a lead developer and software engineer with a passion for building web applications.">
<meta property="og:description" content="Scott Galloway is a lead developer and software engineer with a passion for building web applications.">
```

نفس الوصف، مقالتي عن [معلومات أساسية الخدمات المقدمة في إطار](/blog/background-services-in-aspnetcore-part1)نفس الوصف كما في موقعي الرئيسي. [نِسَسْس نِسْس](/blog/rag-architecture)نفس الوصف

يرى جوجل 200+ صفحات بأوصاف متطابقة ويعتقد أن "هذا الموقع لديه قضايا محتوى مكررة" أو "هذا الموقع لا يهتم بتوفير معلومات مفيدة." في كلتا الحالتين، يتضرر الترتيب.

## 

لدي مدونة متعددة اللغات مع ترجمات. نفس المحتوى موجود في:

- `/blog/my-article` (الإنكليزية)
- `/blog/my-article/fr` )بالفرنسية(
- `/blog/my-article/de` )ألمانيا(

بدون URLs Canonical URLs، قد ترى جوجل هذه كمحتوى مكرر، تمييع قيمة SEW عبر URLs متعددة بدلا من توحيدها على الصفحة الأولية.

## لا

يمكن لنتائج البحث في جوجل أن تظهر المقتطفات الغنية - معلومات المؤلف، تواريخ النشر، مقالات معاينة. ولكن فقط إذا أخبرت جوجل عن هذه البيانات باستخدام هذه البيانات. [بيانات منظمة JSSN-DLD](https://developers.google.com/search/docs/appearance/structured-data/article)لم أكن.. لم أكن..

## الصور الاجتماعية الساكنة

كل صفحة تتشارك في نفس `og:image`في حين أن هذا لا يؤثر بشكل مباشر على ترتيب جوجل، فإنه يؤثر على معدلات النقر من خلال عندما يتم تقاسم المقالات على وسائل الإعلام الاجتماعية - التي تؤثر بشكل غير مباشر على SEO من خلال إشارات المشاركة.

# المثبثات

## 1- الوصفات

أول تثبيت كان جعل تصميم دعم التوصيفات الديناميكية مع تراجع معقول:

```html
@{
    var currentUrl = $"https://{Context.Request.Host}{Context.Request.Path}";
    var defaultDescription = "Scott Galloway is a lead developer and software engineer with a passion for building web applications.";
    var pageDescription = ViewBag.Description as string ?? defaultDescription;
}

<!-- Canonical URL -->
<link rel="canonical" href="@currentUrl" />

<!-- Facebook Meta Tags -->
<meta property="og:url" content="@currentUrl">
<meta property="og:type" content="@(ViewBag.OgType ?? "website")">
<meta property="og:title" content="@ViewBag.Title">
<meta property="og:description" content="@pageDescription">
<meta property="og:site_name" content="mostlylucid" />

<!-- Twitter Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="@ViewBag.Title">
<meta name="twitter:description" content="@pageDescription">

<!-- Meta Description -->
<meta name="description" content="@pageDescription" />

<!-- Article metadata for blog posts -->
@if (ViewBag.PublishedDate != null)
{
    <meta property="article:published_time" content="@(((DateTime)ViewBag.PublishedDate).ToString("yyyy-MM-ddTHH:mm:ssZ"))" />
    <meta property="article:author" content="Scott Galloway" />
}
@if (ViewBag.Categories != null)
{
    foreach (var category in ViewBag.Categories)
    {
        <meta property="article:tag" content="@category" />
    }
}
```

الـ الآن الـ الآن الـ الآن الـ `ViewBag.Description` IF set إلى a افتراضي الـ URL هو set إلى الحالي صفحة URL.

## الوصفات الوصفية الذاتية التشغيل للوظائـل

كل تدوينة الآن تولد مواصفاتها من أول 155 حرفاً من المحتوى. `Post.cshtml`:

```html
@using Mostlylucid.Shared.Helpers
@model Mostlylucid.Models.Blog.BlogPostViewModel

@{
    Layout = "_Layout";
    ViewBag.Title = $"{Model.Title} ({Model.Language.ConvertCodeToLanguage()})";

    // Generate description from plain text content (first 155 chars, truncate at word boundary)
    var plainText = Model.PlainTextContent ?? "";
    var description = plainText.Length > 155
        ? plainText.Substring(0, plainText.LastIndexOf(' ', 155)) + "..."
        : plainText;
    description = description.Replace("\n", " ").Replace("\r", "").Trim();
    ViewBag.Description = description;

    // Set article metadata
    ViewBag.OgType = "article";
    ViewBag.PublishedDate = Model.PublishedDate;
    ViewBag.Categories = Model.Categories;

    // Build canonical URL (without language suffix for English)
    var canonicalUrl = Model.Language == "en"
        ? $"https://{Context.Request.Host}/blog/{Model.Slug}"
        : $"https://{Context.Request.Host}/blog/{Model.Slug}/{Model.Language}";
}
```

وفيما يلي النقاط الرئيسية الرئيسية هنا:

1. **التدرج عند كلمة حد كلمة كلمة** - نجد الفضاء الأخير قبل 155 حرفاً لتجنب قطع الكلمات لنصفين
2. **خطوط الهاتف الجديدة** - ينبغي أن تكون الوصفات الوصفية خطاً واحداً
3. ** `og:type` "إلى"** -يخبر المنتديات الاجتماعية أن هذا مقال، وليس صفحة شبكية عامة
4. **البيانات الوصفية التي تُمر عبر** - تاريخ النشر والفئات التي تتدفق من خلالها إلى تصميم

## ٣ - البيانات المنظمة JSON-DLD

هذا هو كبير لـ غنيّ إضافة a JSON LD مربع إلى تدوينة نص اعرض:

```html
<!-- JSON-LD Structured Data for Blog Post -->
<script type="application/ld+json">
{
    "@@context": "https://schema.org",
    "@@type": "BlogPosting",
    "headline": "@Model.Title",
    "description": "@description",
    "datePublished": "@Model.PublishedDate.ToString("yyyy-MM-ddTHH:mm:ssZ")",
    @if (Model.UpdatedDate.HasValue)
    {
        @:"dateModified": "@Model.UpdatedDate.Value.ToString("yyyy-MM-ddTHH:mm:ssZ")",
    }
    "author": {
        "@@type": "Person",
        "name": "Scott Galloway",
        "url": "https://mostlylucid.net/blog/aboutme"
    },
    "publisher": {
        "@@type": "Organization",
        "name": "mostlylucid",
        "logo": {
            "@@type": "ImageObject",
            "url": "https://mostlylucid.net/img/logo.svg"
        }
    },
    "mainEntityOfPage": {
        "@@type": "WebPage",
        "@@id": "@canonicalUrl"
    },
    "wordCount": @Model.WordCount,
    "inLanguage": "@Model.Language",
    "keywords": "@string.Join(", ", Model.Categories)",
    "image": "https://mostlylucid.net/img/social2.jpg"
}
</script>
```

ملاحظة `@@` مـن أجـل مـن أجـل `@` رمز في رُسْم الرَّسْم - استخدامات JSON-LD `@context` وقد عقد مؤتمراً بشأن `@type` التي يمكن تفسيرها بطريقة أخرى على أنها عبارة عن غزر.

هذه البيانات المُرسَلة تُخبر جوجل:

- **ما هو نوع هذا النوع من هذا** (BBlog يَنَهْز)
- **الذي كتبها** (يطبع مع عنوان إلى تعلّم المزيد)
- **عندما تم نشرها وتعديلها**
- **ما هي المواضيع التي تُغطيها** (الكلمات الرئيسية من الفئات)
- **كم من الوقت هو** (الكلمة conunt)
- **ما هي اللغة التي هي بها**

يمكن لـ جوجل أن يستخدم هذا لعرض مقتطفات غنية في نتائج البحث، بما في ذلك معلومات المؤلفين، تواريخ النشر، وأكثر.

## 4- الوصفات الوصفية الفريدة للصحائف الرئيسية

لا تنسوا صفحاتكم الثابتة كل واحد يجب أن يكون له وصف فريد ذو صلة

```html
<!-- Home page -->
@{
    ViewBag.Title = "mostlylucid- Scott Galloway's Developer Blog";
    ViewBag.Description = "Technical blog covering ASP.NET Core, C#, Entity Framework, HTMX, Docker, and modern web development. Practical tutorials, NuGet packages, and open source projects.";
}

<!-- Blog index -->
@{
    ViewBag.Title = "Blog Posts";
    ViewBag.Description = "Technical articles on ASP.NET Core, C#, Entity Framework, Docker, and modern web development. Practical tutorials and real-world examples from a lead developer.";
}

<!-- Contact page -->
@{
    ViewBag.Title = "Contact Scott Galloway";
    ViewBag.Description = "Get in touch with Scott Galloway. Questions about ASP.NET Core, C#, web development, or collaboration opportunities? Send me a message.";
}

<!-- Search page -->
@{
    ViewBag.Title = "Search Results";
    ViewBag.Description = "Search through technical articles on ASP.NET Core, C#, Entity Framework, and web development. Find tutorials, guides, and solutions.";
}
```

# مواد أساسية أخرى أخرى SDEO

## SCLA-

تحتاج إلى خريطة موقع. هنا متحكم بسيط يولّد واحد ديناميكياً:

```csharp
public class SiteMapController(
    IBlogViewService blogViewService,
    IHttpContextAccessor httpContextAccessor) : Controller
{
    [HttpGet]
    [ResponseCache(Duration = 43200)] // Cache for 12 hours
    public async Task<IActionResult> Index()
    {
        var pages = await blogViewService.GetPosts();
        var siteUrl = $"https://{httpContextAccessor.HttpContext?.Request.Host}";

        XNamespace sitemap = "http://www.sitemaps.org/schemas/sitemap/0.9";

        var feed = new XDocument(
            new XDeclaration("1.0", "utf-8", null),
            new XElement(sitemap + "urlset",
                from page in pages
                select new XElement(sitemap + "url",
                    new XElement(sitemap + "loc", $"{siteUrl}/blog/{page.Slug}"),
                    new XElement(sitemap + "lastmod", page.PublishedDate.ToString("yyyy-MM-dd")),
                    new XElement(sitemap + "changefreq", "weekly"),
                    new XElement(sitemap + "priority", "0.8")
                )
            )
        );

        return Content(feed.ToString(), "text/xml");
    }
}
```

سِجِّل الطريق:

```csharp
app.MapControllerRoute(
    name: "sitemap",
    pattern: "sitemap.xml",
    defaults: new { controller = "SiteMap", action = "Index" });
```

## روبوتات.txt

أخبر محركات البحث أين موقعك و ماذا تزحف:

```csharp
app.MapGet("/robots.txt", async context =>
{
    var siteUrl = $"https://{context.Request.Host}";
    var robotsTxt = $"""
        User-agent: *
        Allow: /

        Sitemap: {siteUrl}/sitemap.xml
        """;

    context.Response.ContentType = "text/plain";
    await context.Response.WriteAsync(robotsTxt);
});
```

## SSSSSSSSSSSSSSSSSSSS

العديد من المطورين يستخدمون قراء RSS. الحصول على تغذية RSS يساعد أيضاً في الكشف عن:

```html
<link rel="alternate" type="application/atom+xml"
      title="RSS Feed for mostlylucid.net"
      href="https://mostlylucid.net/rss" />
```

# ماذا عن الصور ؟

قد تتساءلون عن توليد صور OG فريدة لكل عمود. بالنسبة لمدوّنة تقنية، ربما لا تستحق الجهد. زحمتك تأتي من:

- **جو جو هذا البحث** - مادة أكثر من كونها أكثر من مجرد صور
- **SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS** - لا توجد صور
- **مجلد نيوز/ أحمرDit** - أن ميزات الأظافر بالكاد مرئية
- **الوصلات الوثيقة** - مشاركة العناوين

من المناسب التعرف على صورة متسقة، فتوليد الصور المخصصة له أهمية أكبر بالنسبة للمحتوى البصري، أو المواقع الإخبارية، أو صفحات التسويق التي تتنافس على النقرات على فيسبوك وتويتر.

إذا كنت تريد توليدها، يمكنك استخدام [صورة](https://docs.sixlabors.com/articles/imagesharp/) (الذي استخدمته بالفعل لمعالجة الصورة) لتنفيذ النص على قالب:

```csharp
public async Task<string> GenerateOgImage(string title, string slug)
{
    using var image = await Image.LoadAsync("wwwroot/img/og-template.png");

    var font = SystemFonts.CreateFont("Arial", 48, FontStyle.Bold);

    image.Mutate(x => x.DrawText(
        new RichTextOptions(font)
        {
            Origin = new PointF(50, 200),
            WrappingLength = 1100
        },
        title,
        Color.White));

    var outputPath = $"wwwroot/og/{slug}.png";
    await image.SaveAsPngAsync(outputPath);
    return $"/og/{slug}.png";
}
```

لكن من أجل مدونه تقنيه؟

# اختبارك

## 

 [مجل نتائج البحث في جوجل](https://search.google.com/test/rich-results) لتثبت صحة بياناتك المهيكلة. ألصق URL وسيخبرك إذا كان JSON-LD صالح وما هي النتائج الغنية التي تستحقها.

## 

ابسط اختبار - اعرض مصدر الصفحة وفحص:

- هو أن `<meta name="description">` فريد من نوعه لهذه الصفحة؟
- هل كان هناك `<link rel="canonical">`?
- هل كان هناك `<script type="application/ld+json">` -مكونة؟

## جاري البحث

بعد الوزع، قدم موقعك إلى [جاري البحث](https://search.google.com/search-console)ويمكنك أيضاً استخدام أداة URL Direction لمعرفة بالضبط كيف ترى جوجل صفحاتك وتطلب إعادة فهرسة.

# أولاً - موجز

التثبيتات كانت واضحة:

/ مشكلة
|---------|-----|
□ أوصاف المستقلات الثابتة `ViewBag.Description` مع توليد تلقائي من المحتوى
□ لا توجد مسارات قانونية مضافة `<link rel="canonical">` إلى مقر
لا توجد بيانات منظمة `BlogPosting` وصفة وصفة بيانية لكل وظيفة في كل وظيفة
معلومات فوقية عن المادة المفقودة `article:published_time`, `article:author`, `article:tag` شارات مُقْتَرْضِ
أوصاف فريدة للمنازل، مدونة، اتصال، صفحات البحث

البصيرة الرئيسية: **جوجل لا يستطيع قراءة عقلك**إذا كان لكل صفحة نفس الوصف، فإن جوجل ليس لديها طريقة لمعرفة ما الذي يجعل كل صفحة فريدة وقيمة. أخبر جوجل عن ماهية كل صفحة، وسوف تصنف بشكل أفضل.

أعطها بضعة أسابيع لـ(جوجل) لإعادة رسم موقعك، وعليك أن ترى التحسينات. SEO لعبة طويلة، لكن هذه الأساسيات هي الأساس الذي يقوم عليه كل شيء آخر.

# & ما

- [مجلز جو جو جو جو جو جو جو جو جو جو جو جوS تنفيذ الم_ مُبد مُ_ مُبد مُ_ مُ_ مُ_ مُبد مُ_ مُ_ مُ_ مُ_ مُ_](https://developers.google.com/search/docs/fundamentals/seo-starter-guide)
- [شِيمة. org](https://schema.org/BlogPosting)
- [بروتوكول الخروف المفتوح](https://ogp.me/)
- [](https://search.google.com/test/rich-results)
- [جاري البحث](https://search.google.com/search-console)