четверг, 23 апреля 2020 г.

Установка 2-х SSL сертификатов на 2-х сайтах на одном Windows Server

Задача

Нужно установить 2 SSL - сертификата на одном сервере (Windows Server)

Решение

В IIS/сайт/Привязки сайта
нужно установить галочку "требовать обозначение имени сервера"



Решение взял из статьи
https://qna.habr.com/q/434575

воскресенье, 12 апреля 2020 г.

C# Как убрать порт по умолчанию при генерации адреса с помощью UriBuilder

Проблема


есть такой код по преобраpованию ссылки

var uriBuilder = new UriBuilder(absoluteUri);
//(код модифицирующий url с помощью механизмов UriBuilder)
...
uriBuilder.ToString()

uriBuilder.ToString() генерирует ссылку с явным указанием порта, даже если порта во входной строке не было

Пример
вход: https://a.b.com/test
выход:https://a.b.com:443/test

Что помогло

Статья
How to remove the port number from a url string
https://stackoverflow.com/questions/2819336/how-to-remove-the-port-number-from-a-url-string

Решение

написал такой вспомогательный метод

private static string GetUriBuilderAsStringWithoutDefaultPort(UriBuilder uriBuilder)
        {
            if (uriBuilder.Uri.IsDefaultPort) uriBuilder.Port = -1;
            return uriBuilder.ToString();
        }

и теперь вместо UriBuilder.ToString() вызваю GetUriBuilderAsStringWithoutDefaultPort(uriBuilder)


C# пример SEO оформления страниц сайта с пейджингом (с учетом рекомендаций Google)

Задача


Оформить дружелюбно для поиска Google страницы сайта с пейджингом

Теория

На английском
SEO Guide to Google Webmaster Recommendations for Pagination
https://moz.com/blog/seo-guide-to-google-webmaster-recommendations-for-pagination

На русском
Постраничная верстка rel=«next|prev»
https://habr.com/ru/post/128746/

Сухая выжимка.
Для страниц каталога , которые реализованы в виде пейджинга рекомендуется прописывать в заголовке страницы

<link rel="prev" href="http://www.example.com/article?story=abc&page=2" /> <link rel="next" href="http://www.example.com/article?story=abc&page=4" />


причем   link rel="prev" не нужен на первой странице, а
link rel="next" не нужен на последней

Решение на C#

public static class UtilsSeo
    {
        private const string pageParamName = "page";

        public static string FindUrlPagePrev(
            string url,
            int? pageNumber,
            int pageSize,
            int itemTotalCount
        )
        {
            var pageNumberStrongDefined = GetStrongDefinedPageNumber(pageNumber);

            if (pageNumberStrongDefined <= 1) return null;

            if (pageNumberStrongDefined > GetMaxPageNumber(pageSize, itemTotalCount)) return null;

            return devuaUtils2014.Urls.UrlParamAddOrChange(url, pageParamName, (pageNumberStrongDefined - 1).ToString());
        }

        private static int GetStrongDefinedPageNumber(int? pageNumber)
        {
            var pageNumberStrongDefined = pageNumber ?? 0;
            if (pageNumberStrongDefined <= 0) pageNumberStrongDefined = 1;
            return pageNumberStrongDefined;
        }

        public static bool IsLastPage(
            int? pageNumber,
            int pageSize,
            int itemTotalCount
            )
        {
           return GetStrongDefinedPageNumber(pageNumber) >= GetMaxPageNumber(pageSize, itemTotalCount);
        }

        private static double GetMaxPageNumber(int pageSize, int itemTotalCount)
        {
            return Math.Ceiling( (double)itemTotalCount / (double)pageSize );
        }

        public static string FindUrlPageNext(
            string url,
            int? pageNumber,
            int pageSize,
            int itemTotalCount
        )
        {
            if (IsLastPage(pageNumber, pageSize, itemTotalCount)) return null;

            var pageNumberStrongDefined = GetStrongDefinedPageNumber(pageNumber);
            
            return devuaUtils2014.Urls.UrlParamAddOrChange(url, pageParamName,
                (pageNumberStrongDefined + 1).ToString());
        }

    }

Утилиты

namespace devuaUtils2014
{
    public static class Urls
    {
        public static string UrlParamRemove(string absoluteUri, string paramName)
        {
            var uriBuilder = new UriBuilder(absoluteUri);
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
            query.Remove(paramName);
            uriBuilder.Query = query.ToString();
            return GetUriBuilderAsStringWithoutDefaultPort(uriBuilder);
        }

        private static string GetUriBuilderAsStringWithoutDefaultPort(UriBuilder uriBuilder)
        {
            if (uriBuilder.Uri.IsDefaultPort)
            {
                uriBuilder.Port = -1;
            }
            return uriBuilder.ToString();
        }

        public static string UrlParamChange(string absoluteUri, string paramName, string paramValue)
        {
            var uriBuilder = new UriBuilder(absoluteUri);
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
            query[paramName] = paramValue;
            uriBuilder.Query = query.ToString();
            
            return GetUriBuilderAsStringWithoutDefaultPort(uriBuilder);
        }


        public static string UrlParamAdd(string absoluteUri, string paramName, string paramValue)
        {
            var uriBuilder = new UriBuilder(absoluteUri);
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
            query.Add(paramName,paramValue); //[paramName] = paramValue;
            uriBuilder.Query = query.ToString();
            
            return GetUriBuilderAsStringWithoutDefaultPort(uriBuilder);
        }

        public static string UrlParamAddOrChange(string absoluteUri, string paramName, string paramValue)
        {
            var uriBuilder = new UriBuilder(absoluteUri);
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
            var res = "";
            if (string.IsNullOrEmpty(query[paramName]))
            {
                res = UrlParamAdd(absoluteUri, paramName, paramValue);
            }
            else
            {
                res = UrlParamChange(absoluteUri, paramName, paramValue);
            } 
            return res;
        }
    }
}

Пример
https://childcourse.com.ua/course?page=2