none
URL Rewrite Extension и AjaxControlToolkit RRS feed

  • Вопрос

  • Добрый день 

    После применения  URL Rewrite Extension: исправляем распространенные проблемы SEO 

    Не работает 

    1.  <AjaxControlToolkit:Accordion ... /> на этой странице - ШОП-ТУРЫ  - БОЛЬШЕ ИНФОРМАЦИИ

    2.  В формах обратной связи (Кпопка ОБРАТНЫЙ ЗВОНОК или Рисунок ПИСЬМО в правом нижнем углу) при обновлении рисунка - <asp:Image ID="imgCaptcha" runat="server" /> происходит полная перезагрузка страницы хотя весь код помещен в айдейт панель

        <div id="button">
                <span class="buttonSend">Отправить сообщение
                </span>
                <div id="s_panel" class="detail">
                    Оставьте свое сообщение в этой форме, и мы получим его на e-mail и обязательно ответим!
                    <asp:UpdatePanel ID="unplForm" runat="server" UpdateMode="Conditional">
                        <ContentTemplate>
                            <table>
                                <tr>
                                    <td>Имя:</td>
                                    <td>
                                        <asp:TextBox ID="txtName" runat="server" />
                                        <asp:RequiredFieldValidator ID="rfvO" runat="server" ControlToValidate="txtName" ErrorMessage="Сообщите Ваше имя" Display="Dynamic" CssClass="cssVal" ToolTip="Сообщите Ваше имя" ValidationGroup="registration" />
                                        <ajaxCT:FilteredTextBoxExtender ID="ftbeO" runat="server" TargetControlID="txtName" ValidChars="АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" />
                                    </td>
                                </tr>
                                <tr>
                                    <td>E-mail:</td>
                                    <td>
                                        <asp:TextBox ID="txtEmail" runat="server" />
                                        <asp:RegularExpressionValidator ID="regtxtPrimaryEmail" runat="server" ControlToValidate="txtEmail"
                                            Display="Dynamic" CssClass="cssVal" ToolTip="Не верный формат" ErrorMessage="Не верный формат"
                                            ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
                                        <asp:RequiredFieldValidator ID="rfvEmail" runat="server" ControlToValidate="txtEmail" ErrorMessage="Укажите Ваш е-майл" Display="Dynamic" CssClass="cssVal" ToolTip="Укажите Ваш е-майл" />
                                    </td>
                                </tr>
                                <tr>
                                    <td>Текст:</td>
                                    <td>
                                        <asp:TextBox ID="txtText" runat="server" TextMode="MultiLine" Height="120px" Width="180px" />
                                        <asp:RequiredFieldValidator ID="rfvText" runat="server" ControlToValidate="txtText" ErrorMessage="Укажите Текст сообщения" Display="Dynamic" CssClass="cssVal" ToolTip="Укажите Текст сообщения" />
                                        <ajaxCT:FilteredTextBoxExtender ID="FilteredTextBoxExtender1" runat="server" TargetControlID="txtText" ValidChars="АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM 1234567890 - " />
                                    </td>
                                </tr>
                                <tr>
                                    <td>Защитный код:</td>
                                    <td>
                                        <div style="width: 100%;">
                                            <div style="width: 49%; float: left; ; text-align: center;">
                                                <asp:Image ID="imgCaptcha" runat="server" />
                                            </div>
                                            <div style="width: 50%; float: right;">
                                                <div style="width: 48%; float: left; text-align: center; top: 3px;">
                                                    <asp:Button ID="btnRef" runat="server" ToolTip="Обновить" Style="background-image: url(../../App_Themes/custom/images/refres.png); background-repeat: no-repeat;"
                                                        BackColor="Transparent" Height="30px" Width="30px" ValidationGroup="Captcha"
                                                        OnClick="bClick" />
                                                </div>
                                                <div style="width: 49%; float: right; ; text-align: center;">
                                                    <asp:TextBox ID="txtCaptcha" runat="server" MaxLength="6" Width="40px" />
                                                </div>
                                            </div>
                                        </div>
                                    </td>
                                </tr>
                            </table>
                            <br />
                            <asp:Button ID="btnSend" runat="server" ToolTip="Отправить"
                                Style="background-image: url(../../App_Themes/custom/images/sendMessag.png); background-repeat: no-repeat;"
                                BackColor="Transparent" Height="52px" Width="59px" OnClick="bClick" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </div>
            </div>

    до использования URL Rewrite Extension: исправляем распространенные проблемы SEO всё работало отлично 

    сайт работает на ASP.NET WebForms  AjAX 3.5\AjaxControlToolkit.dll

     <system.web>
        <compilation debug="true" targetFramework="4.0">

    Прошу помочь с решением данной задачи 

    С уважением Юрий




    • Изменено krakoss 24 июля 2014 г. 9:34
    24 июля 2014 г. 9:29

Ответы

  • итак подведем итог

    файл веб конфиг для примера (сайт работает с базой SQLite - маленькая и удобная для сайтов визиток)

    <?xml version="1.0"?> <configuration> <connectionStrings> <add name="ConStr" connectionString="data source=|DataDirectory|home.db" providerName="System.Data.SQLite"/> </connectionStrings> <appSettings/> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite"/> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/> </DbProviderFactories> </system.data> <system.web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Data.SQLite, Culture=neutral, PublicKeyToken=DB937BC2D44FF139"/> <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Data.Services.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation> <authentication mode="Forms"> <forms name="***" loginUrl="***.aspx"/> </authentication> <!--RemoteOnly--> <customErrors mode="On"/> <pages controlRenderingCompatibilityVersion="4.0"> <namespaces> <clear/> <add namespace="System"/> <add namespace="DSTableAdapters"/> <add namespace="System.IO"/> <add namespace="System.Collections"/> <add namespace="System.Collections.Generic"/> <add namespace="System.Collections.Specialized"/> <add namespace="System.Configuration"/> <add namespace="System.Data"/> <add namespace="System.Text"/> <add namespace="System.Text.RegularExpressions"/> <add namespace="System.Web"/> <add namespace="System.Web.Caching"/> <add namespace="System.Web.SessionState"/> <add namespace="System.Web.Security"/> <add namespace="System.Web.Profile"/> <add namespace="System.Web.UI"/> <add namespace="System.Web.UI.WebControls"/> <add namespace="System.Web.UI.WebControls.WebParts"/> <add namespace="System.Web.UI.HtmlControls"/> <add namespace="Udove"/> </namespaces> <controls> <add tagPrefix="ajaxCT" namespace="AjaxControlToolkit" assembly="AjaxControlToolkit"/> <add tagPrefix="ajaxCT" namespace="AjaxControlToolkit.HTMLEditor" assembly="AjaxControlToolkit"/> <add tagPrefix="udp" tagName="TextBoxCalendar" src="~/Controls/TextBoxCalendar.ascx"/> <add tagPrefix="udp" tagName="Content" src="~/Controls/Content.ascx"/> <add tagPrefix="udp" tagName="TopMenu" src="~/Controls/TopMenu.ascx"/> <add tagPrefix="udp" tagName="MobMenu" src="~/Controls/MobMenu.ascx"/> </controls> </pages> </system.web> <system.net> <mailSettings> <smtp deliveryMethod="Network" from="info@idealhome.biz"> <network host="smtp" port="25" defaultCredentials="false" password="***" userName="***"/> <!--port="465"--> </smtp> </mailSettings> </system.net> <system.webServer> <rewrite> <rules> <rule name="Документ по умолчанию" stopProcessing="true"> <match url="(.*?)/?Default\.aspx$"/> <action type="Redirect" url="{R:1}/"/> </rule> </rules> </rewrite> <!--Для подключения видео в формате HTML5--> <staticContent> <mimeMap fileExtension=".ogg" mimeType="video/ogg"/> <mimeMap fileExtension=".ogv" mimeType="video/ogg"/> <mimeMap fileExtension=".mp4" mimeType="video/mp4"/> </staticContent>

    <!--Для переопределения страницы ошибок-->
        <httpErrors>
          <remove statusCode="401" subStatusCode="-1" />
          <remove statusCode="403" subStatusCode="-1" />
          <remove statusCode="404" subStatusCode="-1" />
          <remove statusCode="500" subStatusCode="-1" />
          <!--Полный URL, когда responsemode является перенаправление-->
          <error statusCode="401" path="http://en.idealhome.biz/page.aspx" responseMode="Redirect" />
          <!--Местный относительный путь, когда responsemode является ExecuteURL-->
          <error statusCode="403" path="~/page.aspx" responseMode="ExecuteURL" />
          <error statusCode="404" path="~/404.aspx" responseMode="ExecuteURL" />
          <error statusCode="500" path="~/page.aspx" responseMode="ExecuteURL" />
        </httpErrors>

    </system.webServer> <location path="Admin"> <system.web> <authorization> <deny users="?"/> </authorization> </system.web> </location> </configuration>

    и файл глобал 

    <%@ Application Language="C#" %>
    <%@ Import Namespace="System.Web.Routing" %>
    <script RunAt="server">
    
        void Application_Start(object sender, EventArgs e) 
        {
            // Код, выполняемый при запуске приложения
            this.RegisterRoutes(RouteTable.Routes);
        }
            protected void Application_BeginRequest(object sender, EventArgs e)
        {
    //Для перезаписи адресов в нижний регистр
    
            string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
            if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
            {
                lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;
    
                Response.Clear();
                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", lowercaseURL);
                Response.End();
            }
        }   
        void Application_Error(object sender, EventArgs e) 
        { 
    // Код, выполняемый при возникновении не обрабатываемой ошибки
           HttpContext con = HttpContext.Current;
            var v = Server.GetLastError();
    
            var HttpEx = v as HttpException;
            if (HttpEx != null && HttpEx.GetHttpCode() > 399 & HttpEx.GetHttpCode() < 418)
            {
                // Invalid URL
                //Response.Redirect("~/PageNotFound.aspx");
                Server.Transfer("~/PageNotFound.aspx");
            }
            else
            {
                // Exception 
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("Page :           " + con.Request.Url.ToString());
                sb.AppendLine("Error Message :  " + v.Message);
                sb.AppendLine("Inner Message :  " + v.InnerException.ToString());
                // Here save text file containing this error details
                string fileName = Path.Combine(Server.MapPath("~/Errors"), DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss") + ".txt");
                File.WriteAllText(fileName, sb.ToString());
                //Server.Transfer("~/ErrorPage.aspx");
                Response.Redirect("~/ErrorPage.aspx");
            }
        }
       void RegisterRoutes(RouteCollection routes)
       {
        routes.MapPageRoute("News", "News/{title}-{id}", "~/News/News.aspx");
        routes.MapPageRoute("Reviews", "Reviews/{title}-{id}", "~/Reviews/View.aspx");
       }
           
    </script>

    результат - http://idealhome.biz/

    Версия Ajax ни как не влияет на эту работу 

    Всё это необходимо для seo оптимизации сайта 

    Если у кого есть еще конструктивные решения прошу сообщить 

    С уважением Юрий 


    • Помечено в качестве ответа krakoss 25 июля 2014 г. 8:27
    • Изменено krakoss 25 июля 2014 г. 9:52
    25 июля 2014 г. 8:26

Все ответы

  • Насколько понял у вас .NET 4, попробуйте использовать более новую версию AJAX, версию 4.0.

    Сделаем содержимое сообщества лучше, вместе!

    25 июля 2014 г. 5:38
    Модератор
  • Это я сделал в первую очередь но не помогло 

    Главное - локально все работает правильно а на хостинге нет 

    как только исключаю этот блок из web.config 

     <system.webServer>

    <rewrite> <rules> <rule name="Документ по умолчанию" stopProcessing="true"> <match url="(.*?)/?Default\.aspx$"/> <action type="Redirect" url="{R:1}/"/> </rule> <rule name="Lower Case URLs Регистр символов в URL" stopProcessing="true"> <match url="[A-Z]" ignoreCase="false"/> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{URL}" pattern="WebResource.axd" negate="true"/> </conditions> <action type="Redirect" url="{ToLower:{URL}}"/> </rule> <rule name="Trailing Slash Слеш в конце" stopProcessing="true"> <match url="(.*[^/])$"/> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/> <add input="{URL}" pattern="WebResource.axd" negate="true"/> </conditions> <action type="Redirect" url="{R:1}/"/> </rule> </rules> </rewrite>

     </system.webServer>

    Все работает правильно 

    загрузил на другой хостинг для анализа - http://colsi-ru.1gb.ru


    • Изменено krakoss 25 июля 2014 г. 7:42
    25 июля 2014 г. 7:28
  • <rule name="Lower Case URLs Регистр символов в URL" stopProcessing="true">
              <match url="[A-Z]" ignoreCase="false"/>
              <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{URL}" pattern="WebResource.axd" negate="true"/>
              </conditions>
              <action type="Redirect" url="{ToLower:{URL}}"/>
            </rule>

    Этот блок кода заменил на 

    protected void Application_BeginRequest(object sender, EventArgs e)
        {
            string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
            if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
            {
                lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;
    
                Response.Clear();
                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", lowercaseURL);
                Response.End();
            }
        }   

    в файле глобал. Функционал остался прежний ссылки переписывает на нижний регистр 

    как заменить оставшиеся ДВА - то есть добиться нужного результата используя файл глобал ??? 

    25 июля 2014 г. 7:55
  • итак подведем итог

    файл веб конфиг для примера (сайт работает с базой SQLite - маленькая и удобная для сайтов визиток)

    <?xml version="1.0"?> <configuration> <connectionStrings> <add name="ConStr" connectionString="data source=|DataDirectory|home.db" providerName="System.Data.SQLite"/> </connectionStrings> <appSettings/> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite"/> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/> </DbProviderFactories> </system.data> <system.web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Data.SQLite, Culture=neutral, PublicKeyToken=DB937BC2D44FF139"/> <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Data.Services.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation> <authentication mode="Forms"> <forms name="***" loginUrl="***.aspx"/> </authentication> <!--RemoteOnly--> <customErrors mode="On"/> <pages controlRenderingCompatibilityVersion="4.0"> <namespaces> <clear/> <add namespace="System"/> <add namespace="DSTableAdapters"/> <add namespace="System.IO"/> <add namespace="System.Collections"/> <add namespace="System.Collections.Generic"/> <add namespace="System.Collections.Specialized"/> <add namespace="System.Configuration"/> <add namespace="System.Data"/> <add namespace="System.Text"/> <add namespace="System.Text.RegularExpressions"/> <add namespace="System.Web"/> <add namespace="System.Web.Caching"/> <add namespace="System.Web.SessionState"/> <add namespace="System.Web.Security"/> <add namespace="System.Web.Profile"/> <add namespace="System.Web.UI"/> <add namespace="System.Web.UI.WebControls"/> <add namespace="System.Web.UI.WebControls.WebParts"/> <add namespace="System.Web.UI.HtmlControls"/> <add namespace="Udove"/> </namespaces> <controls> <add tagPrefix="ajaxCT" namespace="AjaxControlToolkit" assembly="AjaxControlToolkit"/> <add tagPrefix="ajaxCT" namespace="AjaxControlToolkit.HTMLEditor" assembly="AjaxControlToolkit"/> <add tagPrefix="udp" tagName="TextBoxCalendar" src="~/Controls/TextBoxCalendar.ascx"/> <add tagPrefix="udp" tagName="Content" src="~/Controls/Content.ascx"/> <add tagPrefix="udp" tagName="TopMenu" src="~/Controls/TopMenu.ascx"/> <add tagPrefix="udp" tagName="MobMenu" src="~/Controls/MobMenu.ascx"/> </controls> </pages> </system.web> <system.net> <mailSettings> <smtp deliveryMethod="Network" from="info@idealhome.biz"> <network host="smtp" port="25" defaultCredentials="false" password="***" userName="***"/> <!--port="465"--> </smtp> </mailSettings> </system.net> <system.webServer> <rewrite> <rules> <rule name="Документ по умолчанию" stopProcessing="true"> <match url="(.*?)/?Default\.aspx$"/> <action type="Redirect" url="{R:1}/"/> </rule> </rules> </rewrite> <!--Для подключения видео в формате HTML5--> <staticContent> <mimeMap fileExtension=".ogg" mimeType="video/ogg"/> <mimeMap fileExtension=".ogv" mimeType="video/ogg"/> <mimeMap fileExtension=".mp4" mimeType="video/mp4"/> </staticContent>

    <!--Для переопределения страницы ошибок-->
        <httpErrors>
          <remove statusCode="401" subStatusCode="-1" />
          <remove statusCode="403" subStatusCode="-1" />
          <remove statusCode="404" subStatusCode="-1" />
          <remove statusCode="500" subStatusCode="-1" />
          <!--Полный URL, когда responsemode является перенаправление-->
          <error statusCode="401" path="http://en.idealhome.biz/page.aspx" responseMode="Redirect" />
          <!--Местный относительный путь, когда responsemode является ExecuteURL-->
          <error statusCode="403" path="~/page.aspx" responseMode="ExecuteURL" />
          <error statusCode="404" path="~/404.aspx" responseMode="ExecuteURL" />
          <error statusCode="500" path="~/page.aspx" responseMode="ExecuteURL" />
        </httpErrors>

    </system.webServer> <location path="Admin"> <system.web> <authorization> <deny users="?"/> </authorization> </system.web> </location> </configuration>

    и файл глобал 

    <%@ Application Language="C#" %>
    <%@ Import Namespace="System.Web.Routing" %>
    <script RunAt="server">
    
        void Application_Start(object sender, EventArgs e) 
        {
            // Код, выполняемый при запуске приложения
            this.RegisterRoutes(RouteTable.Routes);
        }
            protected void Application_BeginRequest(object sender, EventArgs e)
        {
    //Для перезаписи адресов в нижний регистр
    
            string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
            if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
            {
                lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;
    
                Response.Clear();
                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", lowercaseURL);
                Response.End();
            }
        }   
        void Application_Error(object sender, EventArgs e) 
        { 
    // Код, выполняемый при возникновении не обрабатываемой ошибки
           HttpContext con = HttpContext.Current;
            var v = Server.GetLastError();
    
            var HttpEx = v as HttpException;
            if (HttpEx != null && HttpEx.GetHttpCode() > 399 & HttpEx.GetHttpCode() < 418)
            {
                // Invalid URL
                //Response.Redirect("~/PageNotFound.aspx");
                Server.Transfer("~/PageNotFound.aspx");
            }
            else
            {
                // Exception 
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("Page :           " + con.Request.Url.ToString());
                sb.AppendLine("Error Message :  " + v.Message);
                sb.AppendLine("Inner Message :  " + v.InnerException.ToString());
                // Here save text file containing this error details
                string fileName = Path.Combine(Server.MapPath("~/Errors"), DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss") + ".txt");
                File.WriteAllText(fileName, sb.ToString());
                //Server.Transfer("~/ErrorPage.aspx");
                Response.Redirect("~/ErrorPage.aspx");
            }
        }
       void RegisterRoutes(RouteCollection routes)
       {
        routes.MapPageRoute("News", "News/{title}-{id}", "~/News/News.aspx");
        routes.MapPageRoute("Reviews", "Reviews/{title}-{id}", "~/Reviews/View.aspx");
       }
           
    </script>

    результат - http://idealhome.biz/

    Версия Ajax ни как не влияет на эту работу 

    Всё это необходимо для seo оптимизации сайта 

    Если у кого есть еще конструктивные решения прошу сообщить 

    С уважением Юрий 


    • Помечено в качестве ответа krakoss 25 июля 2014 г. 8:27
    • Изменено krakoss 25 июля 2014 г. 9:52
    25 июля 2014 г. 8:26