Thứ ba, ngày 21 tháng 11 năm 2017

Một số lỗi thường gặp khi rewrite url trong ASP.Net (sử dụng UrlRewritingNet)

Ngày đăng: 7/3/2011, 19:42:26PM | Lượt xem: 18,380
Hot!

Rewrite url rõ rang là có rất nhiều tiện lợi, các liên kết được thể hiện rõ ràng về mặt nội dung, giúp cho website của bạn dễ được tìm kiếm, hay giấu file và đường dẫn thực trên server của bạn. Tuy nhiên công việc đó không phải lúc nào cũng đơn giản đối với những bạn mới bắt đầu. Qua một thời gian tìm hiểu, tôi xin nêu ra một số lỗi mà các bạn thường gặp như: mất liên kết các file hình ảnh, css, javascript, lỗi khi postback,… phải và cách giải quyết.

Một số lỗi thường gặp khi rewrite url trong ASP.Net (sử dụng UrlRewritingNet)

Rewrite url rõ rang là có rất nhiều tiện lợi, các liên kết được thể hiện rõ ràng về mặt nội dung, giúp cho website của bạn dễ được tìm kiếm, hay giấu file và đường dẫn thực trên server của bạn. Tuy nhiên công việc đó không phải lúc nào cũng đơn giản đối với những bạn mới bắt đầu. Qua một thời gian tìm hiểu, tôi xin nêu ra một số lỗi mà các bạn thường gặp như: mất liên kết các file hình ảnh, css, javascript, lỗi khi postback,… phải và cách giải quyết.

Chào các bạn!

Tôi hy vọng bài viết sau đây, sẽ giải quyết được phần nào những thắc mắc của các bạn yêu lập trình Asp.net C#. Bài viết này chỉ là quan điểm của cá nhân tôi, cách mà tôi sử dụng, ngoài ra bạn có thể tự tìm cho mình những cách tối ưu hơn!

Khi bạn đến với website http://lichsu.vn chắc chắn các bạn đã tìm hiểu rất nhiều trên các công cụ tìm kiếm, trên những website về lập trình, nhưng có lẽ vẫn chưa có những câu trả lời thỏa mãn cho các bạn.

Tôi xin nếu ra các vấn đề bạn thường gặp như sau:

1)      Cách rewrite url trong asp.net C# sử dụng UrlRewriting.Net như thế nào?

2)      Hiển thị các querytring với những ID khô khan thành đoạn text thân thiện.

3)      Vấn đề mất các liên kết hình ảnh, css, javascript khi rewrite url.

4)      Vấn đề khi trang có postback thì url lại quay về url thực.

5)      Vấn đề phân trang có sử dụng CollectionPager trong các trang đã được rewrite.

6)      Gặp lỗi khi upload lên hosting.

 

Bài thứ 1: Cách rewrite url trong asp.net C# sử dụng UrlRewriting.Net như thế nào?

UrlRewriting.Net là một Open Source Component rất dễ dàng và đáng tin cậy để viết lại Url với ASP.Net. Component này được thiết kế và phát triển vào năm 2006 và chạy trên nền ASP.Net 2.0, tuy nhiên nó vẫn chạy tốt trên nền ASP.Net 3.5.

Yêu cầu chỉ cần một webserver ASP.Net, ví dụ IIS (các phiên bản từ 5.0 đến 7.0)

Cách sử dụng: Download file dll UrlRewritingNet.dll tại đây. Sau đó kích chuột phải vào website của bạn (trên VS 2005 hoặc 2008), chọn Add Reference – trong hộp thoại hiện ra bạn chọn TAB Browse và trỏ đến file dll vừa download về.

Lich su Viet Nam

 

Tiếp theo là bạn cần cấu hình trong file Web.config như sau:

-          Thêm đoạn sau vào bên trong cặp thẻ đóng mở configSections

<configSections>

<section
name="urlrewritingnet" requirePermission="false"
type="UrlRewritingNet.Configuration.UrlRewriteSection,
UrlRewritingNet.UrlRewriter" />

</configSections>

-          Thêm vào trong cặp thẻ đóng mở httpModules

<httpModules>

      <clear/>

<add name="UrlRewriteModule"type="UrlRewritingNet.Web.UrlRewriteModule,
UrlRewritingNet.UrlRewriter"
/>

</httpModules>

 

Như vậy là bạn đã cấu hình xong để có thể bắt đầu sử dụng UrlRewritingNet.

Cách của tôi là đặt ra các quy tắc (rule), trong hàm Application_BeginRequest trong file Global.asax, cho nên các bạn cũng phải add thêm file Global.asax vào trong project của mình.

 

Bây giờ giả sử project của chúng ta là một website bán hàng, có Categories (nhóm sản phẩm), và Products (sản phẩm), việc phân tích cơ sở dữ liệu thế nào, tôi sẽ không bàn tới trong bài viết này.

Đường dẫn thực:

Danh sách các sản phẩm trong nhóm có ID = 1: http://lichsu.vn/Categories.aspx?catid=1

Chi tiết sản phẩm có ID = 100 và CatID = 1: http://lichsu.vn/Products.aspx?catid=1&id=100

Bạn muốn viết lại thành

1)      http://lichsu.vn/1/Thoi-trang.html

2)      http://lichsu.vn/1/100/Quan-jean-ninomaxx.html

Đây là tôi ví dụ như vậy, còn tùy theo sở thích mà các bạn rewrite theo ý của mình. Để làm được như vậy trước hết các bạn phải hiểu, webserver sau khi nhận được request từ đường link (đã được rewrite), sẽ dựa vào những rule mà bạn đặt ra trong phương thức Application_BeginRequest (Global.asax)

Ví dụ với 02 trường hợp trên:

void Application_BeginRequest(object sender, EventArgs e)
    {
      //Khoi tao rule
      UrlRewritingNet.Web.RegExRewriteRule ruleCategory = new UrlRewritingNet.Web.RegExRewriteRule();
      UrlRewritingNet.Web.RegExRewriteRule ruleProduct = new UrlRewritingNet.Web.RegExRewriteRule();
      //Rule – rewrite cho Products
      ruleProduct.VirtualUrl = "^~/(.*)/(.*)/(.*).html";
      ruleProduct.DestinationUrl = "~/Products.aspx?catid=$1&amp;id=$2";
      ruleProduct.IgnoreCase = true;
      ruleProduct.Rewrite = UrlRewritingNet.Web.RewriteOption.Application;
      ruleProduct.Redirect = UrlRewritingNet.Web.RedirectOption.None;
      ruleProduct.RewriteUrlParameter = UrlRewritingNet.Web.RewriteUrlParameterOption.ExcludeFromClientQueryString;
      UrlRewritingNet.Web.UrlRewriting.AddRewriteRule("Product_Rule", ruleProduct);
 
      //Rule – rewrite cho Categories
      ruleCategory.VirtualUrl = "^~/(.*)/(.*).html"; //1-CatID, 2-CatName
      ruleCategory.DestinationUrl = "~/Categories.aspx?catid=$";
      ruleCategory.IgnoreCase = true;
      ruleCategory.Rewrite = UrlRewritingNet.Web.RewriteOption.Application;
      ruleCategory.Redirect = UrlRewritingNet.Web.RedirectOption.None;
      ruleCategory.RewriteUrlParameter =   UrlRewritingNet.Web.RewriteUrlParameterOption.ExcludeFromClientQueryString;
      UrlRewritingNet.Web.UrlRewriting.AddRewriteRule("Category_Rule", ruleCategory);
    }

 

Ở đây, các bạn hãy bỏ qua các khai báo, các khởi tạo, mà hay quan tâm đến 4 dòng lệnh sau: 

//Mã để rewrite http://lichsu.vn/1/100/Quan-jean-ninomaxx.html

ruleProduct.VirtualUrl = "^~/(.*)/(.*)/(.*).html";

//1-CatID, 2-ProductID, 3-ProductName

ruleProduct.DestinationUrl = "~/Products.aspx?catid=$1&amp;id=$2";

Ý nghĩa của 2 dòng lệnh trên có thể diễn giải một cách nôm na như sau:

Khi gặp một url có dạng /abc/xyz/jqk.html mà trước nó là root folder thì thực tế sẽ chạy url Products.aspx?catid=abc&id=xyz(vì theo khai báo ở DestinationUrl thì catid sẽ nhận giá trị tại parameter 1, và id của sản phẩm sẽ nhận parameter ở vị trí thứ 2). Tương tự ta cũng có thể hiểu được đối với 2 dòng lệnh sau:

//Mã để rewrite http://lichsu.vn/1/Thoi-trang.html

ruleCategory.VirtualUrl = "^~/(.*)/(.*).html"; //1-CatID, 2-CatName

ruleCategory.DestinationUrl = "~/Categories.aspx?catid=$1";

Nếu như các bạn làm đúng theo các hướng dẫn của tôi như trên, bây giờ các bạn có thể thử gõ trên thanh địa chỉ trình duyệt http://localhost:xxxx/1/Thoi-trang.html bạn sẽ thấy hiện lên nội dung của trang http://localhost:xxxx/Categories.aspx?id=1 (nếu thấy hiện ra đúng, như vậy các bạn đã đi được 1/6 quãng đường rồi :D).

Một chú ý nho nhỏ cho các bạn khi viết các quy tắc trong Global.asax

-          Đặt các khối lệnh mà trong đó rule có nhiều parameter lên phía trước, nguyên nhân, nếu đặt khối ít lên trước, thì gặp đường dẫn có nhiều parameter nhưng vẫn thỏa mãn rule ít parameter, thì nó sẽ chạy sai trang à sinh ra lỗi. Ví dụ trên tôi đã đặt rule để rewrite product lên trước.

-          Đối với các rule có số parameter bằng nhau (mỗi thằng 2, hoặc mỗi thằng 3), cố gắng truyền thêm một parameter vào một rule nào đó (mặc dù parameter đó sẽ không dùng đến). Nếu tiếp tục bằng với một rule khác, hãy sử dụng Regular Expression để phân biệt, hoặc các điều kiện if-else nào đó mà bạn có thể sử dụng được. Trong bài này, tôi không pro RegEx lắm nên không thể hướng dẫn các bạn được (trước có học, nhưng bây giờ thì quên gần hết).

Mình thấy một số bạn còn mắc về cách rewrite url của bạn đoàn thành nhân ở trên lên mình đưa thêm cho các bạn một cách rewrite mà hiện nay mình đang sử dụng. Các bạn chỉ cần chỉnh lại đường dẫn ảo và đường dẫn thực là ok. Cách này thì có lẽ đơn giản và trực quan nhất cho các bạn

<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
	<configSections>
		<section name="urlrewritingnet" requirePermission="false" type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"/>
		<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
			<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
				<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
				<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
					<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
					<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
					<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
					<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
				</sectionGroup>
			</sectionGroup>
		</sectionGroup>
	</configSections>
	<urlrewritingnet rewriteOnlyVirtualUrls="true" contextItemsPrefix="QueryString" defaultPage="Default.aspx" defaultProvider="RegEx" xmlns="http://www.urlrewriting.net/schemas/config/2006/07">
		<rewrites>
			<add name="RewriteNews" virtualUrl="^~/(\d+)/(\d+)/(.*).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/DetailNews.aspx?ID=$1&amp;CatID=$2" ignoreCase="true"/>
			<add name="RewriteCate1" virtualUrl="^~/(\d+)/(.*).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/Cate.aspx?IDParent=$1" ignoreCase="true"/>
			<add name="RewriteCate2" virtualUrl="^~/(\d+)-(.*).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/Cate.aspx?SubID=$1" ignoreCase="true"/>
			<add name="Rewritetags" virtualUrl="^~/(.*).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/tag.aspx?tag=$1" ignoreCase="true"/>
          
        </rewrites>
	</urlrewritingnet>
	<appSettings/>
	<connectionStrings>
    <add name="ConnectionString" connectionString="data source=DOANHKISI\DOANHKISI;initial catalog=abc;user id=sa;password=123456;persist security info=False;packet size=4096" />
     

    <add name="Subtitle" connectionString="VietShare.vn-học hỏi-chia sẻ-phát triển"/>
    <add name="Keyword" connectionString=" Asp.net, C#, ajax, Csharp, javascript,android, html, xml, css, jquery, Database, SQL server, thu thuat, the gioi website,cong nghe thong tin,lap trinh, giai tri" />
    <add name="metadescript" connectionString="VietShare.vn-học hỏi-chia sẻ-phát triển, website này do doanhkisi - stty - GaPro - Phát triển và giữ bản quyền " />
 </connectionStrings>
	<system.web>
		<trace enabled="true" mostRecent="true" localOnly="true"/>
		<sessionState timeout="2440"></sessionState>
		<!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
        -->
		<roleManager enabled="true"/>
		<authorization>
		</authorization>
		<compilation debug="true">
			<assemblies>
				<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
				<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
				<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
				<add assembly="System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.DirectoryServices.Protocols, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
				<add assembly="System.Web.RegularExpressions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies>
		</compilation>
		<!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
		<authentication mode="Forms">
			<forms loginUrl="Login.aspx"/>
		</authentication>
		<!--
            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace./stty.somee.com
    -->
		<customErrors mode="Off" defaultRedirect="~/Error/ErrorPage.aspx">
			<error statusCode="403" redirect="~/Error/NoAccess.aspx"/>
			<error statusCode="404" redirect="~/Error/FileNotFound.aspx"/>
		</customErrors>
		<pages>
			<controls>
				<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
				<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
			</controls>
		</pages>
		<httpHandlers>
			<remove verb="*" path="*.asmx"/>
			<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
			<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
			<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
		</httpHandlers>
		<httpModules>
			<add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
			<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
		</httpModules>
	</system.web>
	<system.codedom>
		<compilers>
			<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
				<providerOption name="CompilerVersion" value="v3.5"/>
				<providerOption name="WarnAsError" value="false"/>
			</compiler>
			<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
				<providerOption name="CompilerVersion" value="v3.5"/>
				<providerOption name="OptionInfer" value="true"/>
				<providerOption name="WarnAsError" value="false"/>
			</compiler>
		</compilers>
	</system.codedom>
	<!-- 
        The system.webServer section is required for running ASP.NET AJAX under Internet
        Information Services 7.0.  It is not necessary for previous version of IIS.
    -->
	<system.webServer>
		<validation validateIntegratedModeConfiguration="false"/>
		<modules>
			<remove name="UrlRewriteModule"/>
			<add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
			<remove name="ScriptModule"/>
			<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
		</modules>
		<handlers>
			<remove name="WebServiceHandlerFactory-Integrated"/>
			<remove name="ScriptHandlerFactory"/>
			<remove name="ScriptHandlerFactoryAppServices"/>
			<remove name="ScriptResource"/>
			<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
			<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
			<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
		</handlers>
	</system.webServer>
	<runtime>
		<assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly>
				<assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
				<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
			</dependentAssembly>
			<dependentAssembly>
				<assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
				<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
			</dependentAssembly>
		</assemblyBinding>
	</runtime>
</configuration>

Các bạn cứ tìm chỗ nào có chữ rewrite là liên quan đến việc rewrite thôi

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
ca do bong da online
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.