Trang chủSandboxTrưng bàyỨng dụngTài liệuBlog
    • EnglishTiếng Anh
      EN
    • русскийTiếng Nga
      RU
    • 日本語Tiếng Nhật
      JA
    • françaisTiếng Pháp
      FR
    • 한국어Tiếng Hàn
      KO
    • 中文Tiếng Trung
      ZH
    • españolTiếng Tây Ban Nha
      ES
    • DeutschTiếng Đức
      DE
    • العربيةTiếng Ả Rập
      AR
    • italianoTiếng Italy
      IT
    • British EnglishTiếng Anh (Anh)
      EN-GB
    • portuguêsTiếng Bồ Đào Nha
      PT
    • हिन्दीTiếng Hindi
      HI
    • TürkçeTiếng Thổ Nhĩ Kỳ
      TR
    • polskiTiếng Ba Lan
      PL
    • IndonesiaTiếng Indonesia
      ID
    • Tiếng ViệtTiếng Việt
      VI
    • українськаTiếng Ukraina
      UK
    /
    Lọc tài liệu theo framework
    Alt+←
    Tại sao Intlayer?
    Bắt đầu
    Khái niệm
    • Intlayer làm việc như thế nào
    • Cấu hình
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Editor visual
    • CMS
    • Tích hợp CI/CD
    • DịchSố nhiềuLiệt kêĐiều kiệnGiới tínhChènTệpNestingMarkdownHTMLLấy hàm
    • File cho mỗi ngôn ngữ
    • Biên dịch
    • Tự động điền
    • Kiểm tra
    • Tối ưu hóa gói
    Môi trường
    • Next.js 14 và App Router
      Next.js 15
      Next.js không locale URL
      Next.js và Page Router
      Trình biên dịch
    • Tanstack Start Solid
    • Astro và React
      Astro và Svelte
      Astro và Vue
      Astro và Solid
      Astro và Preact
      Astro và Lit
      Astro và Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt và Vue
    • Vite và Solid
    • SvelteKit
    • Vite và Preact
    • Vite và Vanilla JS
    • Vite và Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native và Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx và React
    Plugins
    • JSON
    • gettext (.po)
    Mở rộng VS Code
    Tác nhân
    • MCP Server
    • Kỹ năng tác nhân
    Phiên bản
    • v8
    • v7
    • v6
    Benchmark
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Blog
    Đặt câu hỏi
    1. Documentation
    2. Khái niệm
    3. Custom_url_rewrites
    \n\n ```\n\n \n \n \n ```tsx\n import { useRewriteURL } from \"solid-intlayer\";\n\n const Layout = (props) => {\n useRewriteURL();\n return <>{props.children};\n };\n ```\n\n \n \n \n ```svelte\n \n\n ```\n\n \n\n\n## Tích hợp Router & Proxies\n\nProxy phía máy chủ của Intlayer (Vite & Next.js) tự động xử lý các rewrites tùy chỉnh để đảm bảo tính nhất quán về SEO.\n\n1. **Rewrites nội bộ**: Khi một người dùng truy cập `/fr/a-propos`, proxy nội bộ sẽ ánh xạ nó tới `/fr/about` để framework của bạn khớp với route chính xác.\n2. **Chuyển hướng có thẩm quyền**: Nếu một người dùng gõ thủ công `/fr/about`, proxy sẽ phát hành chuyển hướng 301/302 tới `/fr/a-propos`, đảm bảo các công cụ tìm kiếm chỉ lập chỉ mục một phiên bản của trang.\n\n### Tích hợp Next.js\n\nViệc tích hợp Next.js được xử lý hoàn toàn thông qua middleware `intlayerProxy`.\n\n```typescript fileName=\"middleware.ts\"\nimport { intlayerProxy } from \"next-intlayer/middleware\";\nimport { NextRequest } from \"next/server\";\n\nexport function middleware(request: NextRequest) {\n return intlayerProxy(request);\n}\n```\n\n### Tích hợp Vite\n\nĐối với SolidJS, Vue và Svelte, plugin Vite `intlayerProxy` quản lý các rewrite trong quá trình phát triển.\n\n```typescript fileName=\"vite.config.ts\"\nimport { defineConfig } from \"vite\";\nimport { intlayerProxy } from \"vite-intlayer\";\n\nexport default defineConfig({\n plugins: [intlayerProxy()],\n});\n```\n\n## Các tính năng chính\n\n### 1. Viết lại đa ngữ cảnh\n\nMỗi formatter tạo ra một `RewriteObject` chứa các quy tắc chuyên biệt cho các bên tiêu thụ khác nhau:\n\n- `url`: Tối ưu cho việc sinh URL phía client (loại bỏ các phân đoạn locale).\n- `nextjs`: Giữ lại `[locale]` cho middleware của Next.js.\n- `vite`: Giữ lại `:locale` cho proxy của Vite.\n\n### 2. Chuẩn hóa mẫu tự động\n\nIntlayer nội bộ chuẩn hóa tất cả các cú pháp mẫu (ví dụ: chuyển `[param]` thành `:param`) để việc khớp mẫu luôn nhất quán bất kể framework nguồn.\n\n### 3. URL Chuẩn SEO\n\nBằng cách thực thi chuyển hướng từ các đường dẫn canonical sang các bí danh thân thiện (pretty aliases), Intlayer ngăn ngừa vấn đề nội dung trùng lặp và cải thiện khả năng được tìm thấy của trang.\n\n## Tiện ích cốt lõi\n\n- `getLocalizedUrl(url, locale)`: Tạo một URL đã được địa phương hóa tuân theo các quy tắc rewrite.\n- `getCanonicalPath(path, locale)`: Giải quyết một URL đã được địa phương hóa trở lại đường dẫn canonical nội bộ của nó.\n- `getRewritePath(pathname, locale)`: Phát hiện nếu một pathname cần được sửa thành bí danh địa phương hóa đẹp hơn.\n","about":"Tìm hiểu cách cấu hình và sử dụng viết lại URL tùy chỉnh trong Intlayer để định nghĩa các đường dẫn theo locale.","url":"https://intlayer.org/vi/doc/concept/custom_url_rewrites","datePublished":"13-08-2024","dateModified":"26-01-2026","keywords":"Viết lại URL Tùy chỉnh, Routing, Internationalization, i18n","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"Nhà phát triển (Developers), Quản trị nội dung (Content Managers)"}}
    Ngày tạo:2024-08-13Cập nhật lần cuối:2026-01-26
    Tham chiếu tài liệu này tới trợ lý AI yêu thích của bạn
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Đặt câu hỏi và nhận tóm tắt tài liệu bằng cách tham chiếu trang này và nhà cung cấp AI bạn chọn

    Lịch sử phiên bản

    1. "Triển khai việc viết lại URL tập trung với bộ định dạng dành cho từng framework và hook useRewriteURL."
      v8.0.025/1/2026

    Nội dung của trang này đã được dịch bằng AI.

    Xem phiên bản mới nhất của nội dung gốc bằng tiếng Anh
    Chỉnh sửa tài liệu này

    Nếu bạn có ý tưởng để cải thiện tài liệu này, vui lòng đóng góp bằng cách gửi pull request trên GitHub.

    Liên kết GitHub tới tài liệu
    Sao chép

    Sao chép Markdown của tài liệu vào bộ nhớ tạm

    Triển khai Viết lại URL Tùy chỉnh

    Intlayer hỗ trợ viết lại URL tùy chỉnh, cho phép bạn định nghĩa các đường dẫn theo locale khác với cấu trúc chuẩn /locale/path. Điều này cho phép các URL như /about cho tiếng Anh và /a-propos cho tiếng Pháp trong khi vẫn giữ logic nội bộ ứng dụng ở dạng chuẩn.

    Cấu hình

    Các rewrite tùy chỉnh được cấu hình trong phần routing của tệp intlayer.config.ts bằng cách sử dụng các bộ định dạng theo framework. Các bộ định dạng này cung cấp cú pháp chính xác cho router mà bạn lựa chọn.

    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";import { nextjsRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ... (các cài đặt khác)  routing: {    mode: "prefix-no-default",    rewrite: nextjsRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";import { reactRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: reactRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";import { tanstackRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ... (cấu hình khác)  routing: {    mode: "prefix-all",    rewrite: tanstackRouterRewrite({      "/$locale/about": {        fr: "/$locale/a-propos",        es: "/$locale/acerca-de",      },      "/$locale/products/$id": {        fr: "/$locale/produits/$id",        es: "/$locale/productos/$id",      },    }),  },};export default config;
    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";import { vueRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: vueRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";import { svelteKitRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // Cấu hình khác...  routing: {    mode: "prefix-all",    rewrite: svelteKitRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";import { solidRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: solidRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";import { nuxtRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: nuxtRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;

    Các formatter có sẵn

    Intlayer cung cấp formatter cho tất cả các framework phổ biến:

    • nextjsRewrite: Dành cho Next.js App Router. Hỗ trợ [slug], [...slug] (1+), và [[...slug]] (0+).
    • svelteKitRewrite: Dành cho SvelteKit. Hỗ trợ [slug], [...path] (0+), và [[optional]] (0-1).
    • reactRouterRewrite: Dành cho React Router. Hỗ trợ :slug và * (0+).
    • vueRouterRewrite: Dành cho Vue Router 4. Hỗ trợ :slug, :slug? (0-1), :slug* (0+), và :slug+ (1+).
    • solidRouterRewrite: Dành cho Solid Router. Hỗ trợ :slug và *slug (0+).
    • tanstackRouterRewrite: Dành cho TanStack Router. Hỗ trợ $slug và * (0+).
    • nuxtRewrite: Dành cho Nuxt 3. Hỗ trợ [slug] và [...slug] (0+).
    • viteRewrite: Bộ định dạng chung cho bất kỳ dự án dựa trên Vite nào. Chuẩn hóa cú pháp cho proxy của Vite.

    Mẫu nâng cao

    Intlayer nội bộ chuẩn hóa những mẫu này thành một cú pháp thống nhất, cho phép khớp đường dẫn và tạo đường dẫn phức tạp:

    • Phân đoạn tùy chọn: [[optional]] (SvelteKit) hoặc :slug? (Vue/React) được hỗ trợ.
    • Bắt tất cả (0 hoặc nhiều): [[...slug]] (Next.js), [...path] (SvelteKit/Nuxt), hoặc * (React/TanStack) cho phép khớp nhiều phân đoạn.
    • Bắt tất cả bắt buộc (1 hoặc nhiều): [...slug] (Next.js) hoặc :slug+ (Vue) đảm bảo ít nhất một phân đoạn tồn tại.

    Sửa URL ở phía khách (Client-Side): useRewriteURL

    Để đảm bảo thanh địa chỉ của trình duyệt luôn phản ánh URL địa phương "đẹp", Intlayer cung cấp hook useRewriteURL. Hook này sẽ âm thầm cập nhật URL bằng window.history.replaceState khi người dùng truy cập vào một đường dẫn chính tắc.

    Sử dụng trong các framework

    tsx
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    'use client';import { useRewriteURL } from "next-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Tự động chỉnh /fr/about thành /fr/a-propos  return <>{children}</>;};
    tsx
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    'use client';import { useRewriteURL } from "react-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Tự động sửa /fr/about thành /fr/a-propos  return <>{children}</>;};
    vue
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    <script setup>import { useRewriteURL } from "vue-intlayer";useRewriteURL();</script>
    tsx
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { useRewriteURL } from "solid-intlayer";const Layout = (props) => {  useRewriteURL();  return <>{props.children}</>;};
    svelte
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    <script>import { useRewriteURL } from "svelte-intlayer";useRewriteURL();</script>

    Tích hợp Router & Proxies

    Proxy phía máy chủ của Intlayer (Vite & Next.js) tự động xử lý các rewrites tùy chỉnh để đảm bảo tính nhất quán về SEO.

    1. Rewrites nội bộ: Khi một người dùng truy cập /fr/a-propos, proxy nội bộ sẽ ánh xạ nó tới /fr/about để framework của bạn khớp với route chính xác.
    2. Chuyển hướng có thẩm quyền: Nếu một người dùng gõ thủ công /fr/about, proxy sẽ phát hành chuyển hướng 301/302 tới /fr/a-propos, đảm bảo các công cụ tìm kiếm chỉ lập chỉ mục một phiên bản của trang.

    Tích hợp Next.js

    Việc tích hợp Next.js được xử lý hoàn toàn thông qua middleware intlayerProxy.

    middleware.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { intlayerProxy } from "next-intlayer/middleware";import { NextRequest } from "next/server";export function middleware(request: NextRequest) {  return intlayerProxy(request);}

    Tích hợp Vite

    Đối với SolidJS, Vue và Svelte, plugin Vite intlayerProxy quản lý các rewrite trong quá trình phát triển.

    vite.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { defineConfig } from "vite";import { intlayerProxy } from "vite-intlayer";export default defineConfig({  plugins: [intlayerProxy()],});

    Các tính năng chính

    1. Viết lại đa ngữ cảnh

    Mỗi formatter tạo ra một RewriteObject chứa các quy tắc chuyên biệt cho các bên tiêu thụ khác nhau:

    • url: Tối ưu cho việc sinh URL phía client (loại bỏ các phân đoạn locale).
    • nextjs: Giữ lại [locale] cho middleware của Next.js.
    • vite: Giữ lại :locale cho proxy của Vite.

    2. Chuẩn hóa mẫu tự động

    Intlayer nội bộ chuẩn hóa tất cả các cú pháp mẫu (ví dụ: chuyển [param] thành :param) để việc khớp mẫu luôn nhất quán bất kể framework nguồn.

    3. URL Chuẩn SEO

    Bằng cách thực thi chuyển hướng từ các đường dẫn canonical sang các bí danh thân thiện (pretty aliases), Intlayer ngăn ngừa vấn đề nội dung trùng lặp và cải thiện khả năng được tìm thấy của trang.

    Tiện ích cốt lõi

    • getLocalizedUrl(url, locale): Tạo một URL đã được địa phương hóa tuân theo các quy tắc rewrite.
    • getCanonicalPath(path, locale): Giải quyết một URL đã được địa phương hóa trở lại đường dẫn canonical nội bộ của nó.
    • getRewritePath(pathname, locale): Phát hiện nếu một pathname cần được sửa thành bí danh địa phương hóa đẹp hơn.
    Tại sao Intlayer?
    Alt+→

    Trong trang này

      Các cuộc thảo luận là ẩn danh và được xem xét thường xuyên để giải quyết các vấn đề phổ biến. Hãy thoải mái chia sẻ ý tưởng tính năng, phản hồi về tài liệu hoặc bất cứ điều gì liên quan đến Intlayer, chúng tôi sử dụng thông tin này để định hình lộ trình và cải thiện sản phẩm.

      import { Locales, type IntlayerConfig } from "intlayer";import { nextjsRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ... (các cài đặt khác)  routing: {    mode: "prefix-no-default",    rewrite: nextjsRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { reactRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: reactRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { tanstackRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ... (cấu hình khác)  routing: {    mode: "prefix-all",    rewrite: tanstackRouterRewrite({      "/$locale/about": {        fr: "/$locale/a-propos",        es: "/$locale/acerca-de",      },      "/$locale/products/$id": {        fr: "/$locale/produits/$id",        es: "/$locale/productos/$id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { vueRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: vueRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { svelteKitRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // Cấu hình khác...  routing: {    mode: "prefix-all",    rewrite: svelteKitRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { solidRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: solidRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { nuxtRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: nuxtRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      'use client';import { useRewriteURL } from "next-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Tự động chỉnh /fr/about thành /fr/a-propos  return <>{children}</>;};
      'use client';import { useRewriteURL } from "react-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // Tự động sửa /fr/about thành /fr/a-propos  return <>{children}</>;};
      <script setup>import { useRewriteURL } from "vue-intlayer";useRewriteURL();</script>
      import { useRewriteURL } from "solid-intlayer";const Layout = (props) => {  useRewriteURL();  return <>{props.children}</>;};
      <script>import { useRewriteURL } from "svelte-intlayer";useRewriteURL();</script>
      import { intlayerProxy } from "next-intlayer/middleware";import { NextRequest } from "next/server";export function middleware(request: NextRequest) {  return intlayerProxy(request);}
      import { defineConfig } from "vite";import { intlayerProxy } from "vite-intlayer";export default defineConfig({  plugins: [intlayerProxy()],});