Trình tạo .htaccess
Tạo các quy tắc Apache .htaccess cho các cấu hình máy chủ phổ biến.
Bắt buộc HTTPS
Bắt buộc WWW / không WWW
Header bảo mật
Nén GZIP
Cache trình duyệt
Trang lỗi tùy chỉnh
Tùy chọn thư mục
Tệp .htaccess được tạo
Một .htaccess là gì?
Tệp .htaccess là một tệp cấu hình cho các máy chủ web Apache. Nó cho phép xác định các chuyển hướng URL, các header bảo mật, các quy tắc cache và nhiều hơn nữa · mà không sửa đổi cấu hình chính của máy chủ.
Câu hỏi thường gặp
Đặt tệp .htaccess ở đâu?
Đặt nó trong thư mục gốc của trang web của bạn (thường là public_html hoặc www). Các quy tắc áp dụng cho thư mục này và tất cả các thư mục con của nó.
Nó có hoạt động với Nginx không?
Không. .htaccess là đặc thù cho Apache. Nginx sử dụng cú pháp cấu hình riêng trong nginx.conf hoặc các tệp config của trang.
.htaccess có thể làm chậm trang web của tôi không?
Apache kiểm tra .htaccess ở mỗi yêu cầu, vì vậy các tệp rất lớn có thể thêm chi phí. Đối với các trang web lưu lượng cao, di chuyển các quy tắc sang config Apache chính nhanh hơn.
File .htaccess thực sự là gì
Một tệp .htaccess là tệp cấu hình theo thư mục của Apache. Tên này được hiểu rộng rãi là viết tắt của «hypertext access,» phản ánh mục đích sử dụng ban đầu của tệp là hạn chế quyền truy cập vào tài liệu hypertext. Đặt một tệp vào bất kỳ thư mục nào và các chỉ thị sẽ áp dụng cho thư mục đó và mọi thư mục con bên dưới. Tệp không có tên trước dấu chấm (đây là dot-file Unix, ẩn theo mặc định) và phải được đặt tên chính xác là .htaccess (chữ thường, dấu chấm đầu) để Apache tìm thấy nó theo cài đặt AccessFileName mặc định.
Có một chi phí hiệu suất thực sự. Tài liệu của Apache nêu rõ: «nếu AllowOverride được đặt để cho phép sử dụng tệp .htaccess, Apache sẽ tìm kiếm tệp .htaccess trong mọi thư mục. Do đó, việc cho phép tệp .htaccess gây ra tác động đến hiệu suất, dù bạn có thực sự sử dụng chúng hay không.» Cây thư mục được duyệt qua trong mọi yêu cầu HTTP. Đối với một yêu cầu đến /var/www/html/foo/bar/baz.html, Apache kiểm tra stat /.htaccess, rồi /var/.htaccess, rồi /var/www/.htaccess, rồi /var/www/html/.htaccess, v.v., ngay cả khi không có tệp nào tồn tại. Khuyến nghị của Apache là sử dụng khối <Directory> trong cấu hình chính khi có thể (phân tích một lần khi khởi động), và dành .htaccess cho các môi trường hosting mà bạn không có quyền truy cập cấu hình chính.
Khi nào bạn cần nó (và khi nào không)
Apache liệt kê hai trường hợp sử dụng hợp lệ cho .htaccess: nhà cung cấp hosting cho phép người dùng kiểm soát hạn chế mà không cần quyền truy cập cấu hình máy chủ đầy đủ, và các trường hợp mà chỉ thị cần khác nhau giữa các thư mục con nơi người triển khai chỉ kiểm soát hệ thống tệp. Ngoài những trường hợp đó, tài liệu khuyến nghị rõ ràng là di chuyển các quy tắc sang khối <Directory> trong cấu hình chính.
nginx (máy chủ web phổ biến thứ hai) không hỗ trợ .htaccess chút nào; nó cố ý từ chối các tệp cấu hình theo thư mục vì lý do hiệu suất, và tất cả cấu hình nằm trong nginx.conf và các tệp site được đưa vào. Nếu dự án của bạn chạy trên nginx, đầu ra của generator này sẽ không giúp ích, bạn cần các khối server / location trong tệp cấu hình nginx. Caddy dùng cú pháp Caddyfile riêng với HTTPS tự động qua Let's Encrypt làm mặc định. LiteSpeed và OpenLiteSpeed hỗ trợ .htaccess để tương thích Apache. IIS dùng web.config.
Viết lại URL và mẫu HTTPS chuẩn
Hầu hết các công việc .htaccess không tầm thường đều dùng mod_rewrite, công cụ viết lại URL dựa trên quy tắc của Apache được xây dựng trên biểu thức chính quy mở rộng POSIX. Cấu trúc cơ bản là RewriteRule pattern substitution [flags], tùy chọn đứng trước một hoặc nhiều điều kiện RewriteCond. Khối force-HTTPS chuẩn:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Các cờ [L,R=301] có nghĩa là «đây là quy tắc cuối cùng trong vòng này» và «phản hồi với HTTP 301 Moved Permanently.» 301 là lựa chọn đúng cho chuyển hướng vĩnh viễn, công cụ tìm kiếm truyền link equity và trình duyệt cache tích cực. Chỉ dùng 302 (Found) cho các chuyển hướng thực sự tạm thời, khi bạn không muốn lần di chuyển được cache.
Phía sau load balancer hoặc reverse proxy kết thúc TLS, máy chủ gốc thấy HTTP thuần ngay cả khi trình duyệt của người dùng đang dùng HTTPS, quy tắc RewriteCond %{HTTPS} off ngây thơ khi đó sẽ chuyển hướng mãi mãi. Cách khắc phục là kiểm tra header được chuyển tiếp thay thế: RewriteCond %{HTTP:X-Forwarded-Proto} !https. Chế độ «Flexible SSL» của Cloudflare (CDN nói HTTP đến máy gốc trong khi người dùng dùng HTTPS) là nguyên nhân phổ biến nhất của bẫy redirect-loop này.
Chọn giữa chuẩn hóa www và non-www bằng một mẫu tương tự. Chọn một tên hostname chuẩn cho SEO (tránh vấn đề nội dung trùng lặp) và cho phạm vi cookie (subdomain www mặc định nhận cookie khác với apex).
Nén và bộ nhớ đệm
mod_deflate nén gzip các phản hồi văn bản, giảm đáng kể kích thước truyền tải cho text/HTML/CSS/JS. Bọc khối trong <IfModule mod_deflate.c> để không làm hỏng site trên các máy chủ không tải module. Brotli (mod_brotli) là phiên bản thay thế hiện đại và dùng cùng mẫu.
mod_expires đặt các header Expires và Cache-Control: max-age. Cú pháp «access plus 1 year» được dùng rộng rãi có nghĩa là tài sản có thể được cache trong một năm kể từ khi người dùng tải về. max-age dài là đúng cho tên tệp tài sản có hash (app.abc123.js); max-age ngắn hơn là đúng cho HTML và mọi thứ có thể thay đổi. Để kiểm soát chi tiết hơn, Header set Cache-Control "public, max-age=31536000, immutable" trên các tệp có hash là best practice hiện đại.
Các header bảo mật đáng biết
- X-Frame-Options: SAMEORIGIN: ngăn trang bị nhúng trong
<iframe>trên các origin khác. Phần lớn đã bị thay thế bởi CSPframe-ancestors. - Content-Security-Policy: phòng thủ chính hiện đại chống XSS và click-jacking. Khởi đầu:
default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'. Siết chặt theo thời gian. - Strict-Transport-Security (HSTS), yêu cầu trình duyệt chỉ nói HTTPS với domain của bạn.
max-age=31536000; includeSubDomainslà baseline điển hình. Chỉ thêmpreloadkhi bạn chắc chắn HTTPS là vĩnh viễn, một khi đã preload vào danh sách HSTS của trình duyệt, việc xóa rất khó. - X-Content-Type-Options: nosniff: ngăn trình duyệt đoán lại header
Content-Type. Header này chỉ có một giá trị. - Referrer-Policy: strict-origin-when-cross-origin: mặc định hiện đại; gửi URL đầy đủ đến các yêu cầu cùng origin, chỉ gửi origin đến các yêu cầu cross-origin, và không gửi gì khi downgrade HTTPS sang HTTP.
- Permissions-Policy: điều khiển các tính năng trình duyệt như camera, microphone, geolocation. Thay thế header Feature-Policy cũ hơn.
- X-XSS-Protection: phần lớn đã bị deprecated. Bộ lọc đã bị xóa khỏi Chrome và chưa bao giờ tồn tại trong Firefox; bảo mật hiện đại dựa vào CSP. Nhiều hướng dẫn cũ vẫn bao gồm nó cho IE cũ, có thể bỏ qua cho các site mới.
Ẩn những gì không nên được phục vụ
Hai dòng lệnh bảo mật cứng hóa xứng đáng được áp dụng:
Options -Indexes: vô hiệu hóa danh sách thư mục được tạo tự động khi không cóindex.html. Nhiều bản phân phối có chỉ mục thư mục bật theo mặc định; một thư mục lạc lõng, không được bảo vệ không nên để lộ nội dung của nó lên web.- Chặn dot-file và metadata kiểm soát mã nguồn. Một khối
<FilesMatch "^(\.htaccess|\.htpasswd|\.env|\.git.*)$">vớiRequire all deniedngăn kẻ tấn công tải xuống.env(thường chứa mật khẩu DB và API key) hoặc.git/config(tiết lộ URL remote và đôi khi thông tin xác thực). Báo cáo mối đe dọa của Akamai và SANS ghi nhận việc lộ.envlà một trong những rò rỉ tầng ứng dụng phổ biến nhất của những năm 2020.
Apache 2.4 thay thế cú pháp Order Allow,Deny cũ bằng họ chỉ thị Require gọn gàng hơn, Require all granted, Require all denied, Require ip 192.0.2.0/24, Require not ip 198.51.100.5. Cú pháp cũ vẫn hoạt động để tương thích ngược nhưng được ghi nhận là deprecated.
Các lỗi thường gặp
- mod_rewrite phải được bật ở cấp máy chủ. Trên Debian/Ubuntu:
sudo a2enmod rewrite && sudo systemctl restart apache2. Không có nó, mọiRewriteRuleđều bị bỏ qua trong im lặng. - AllowOverride quan trọng. Nếu cấu hình chính có
AllowOverride Nonecho<Directory>của bạn, mọi chỉ thị trong.htaccesscủa bạn đều bị bỏ qua trong im lặng.AllowOverride Allcho phép tất cả;AllowOverride FileInfo AuthConfigchỉ cho phép viết lại và xác thực, đủ cho hầu hết các trường hợp sử dụng. - Một lỗi đánh máy duy nhất phá vỡ toàn bộ site. Apache trả về 500 Internal Server Error cho mọi yêu cầu đến cây thư mục bị ảnh hưởng cho đến khi tệp được sửa. Luôn kiểm tra trong staging trước; giữ một bản sao dự phòng có tên
.htaccess.bak; chuẩn bị quyền truy cập SSH/FTP để bạn có thể đổi tên tệp bị hỏng từ xa. Xem/var/log/apache2/error.logđể biết thông báo cú pháp. - Vòng lặp chuyển hướng vô hạn. Trình duyệt giới hạn chuỗi chuyển hướng ở khoảng 20 hop và hiển thị
ERR_TOO_MANY_REDIRECTS. Nguyên nhân phổ biến nhất: quy tắc HTTPS-redirect chạy trên máy chủ phía sau proxy kết thúc TLS (dùng%{HTTP:X-Forwarded-Proto}); các quy tắc www và HTTPS sai thứ tự gây chuyển hướng kép; chế độ Cloudflare Flexible SSL. - Cờ
[L]chạy lại engine viết lại từ đầu với URL đã viết lại. Nếu một quy tắc sau đó khớp, hành vi có thể bất ngờ. Dùng[END](Apache 2.3.9+) khi bạn thực sự muốn dừng hoàn toàn. - Ngữ cảnh theo thư mục loại bỏ dấu gạch chéo đầu. Trong
.htaccess,RewriteRule ^index\.html$ home.htmlkhớp;RewriteRule ^/index\.html$thì không. Điều này làm vấp mọi người sao chép quy tắc từ ví dụ cấu hình chính. - Một số chỉ thị bị cấm trong .htaccess:
<VirtualHost>,<Directory>,<Location>,Listen,ServerNamechỉ dành cho cấu hình chính. Tệp theo thư mục đã áp dụng ngầm định cho thư mục của chính nó.
Câu Hỏi Thêm
Tệp nên đặt ở đâu chính xác?
Trong thư mục có nội dung bạn muốn kiểm soát. Hầu hết người dùng shared-hosting đặt nó trong document root của site, public_html/, www/, hoặc htdocs/ tùy nhà cung cấp. Apache sau đó duyệt cây thư mục áp dụng các quy tắc cho thư mục đó và mọi thư mục con bên dưới.
301 hay 302, nên dùng chuyển hướng nào?
301 Moved Permanently cho các di chuyển vĩnh viễn. Công cụ tìm kiếm chuyển link equity sang URL mới; trình duyệt cache chuyển hướng tích cực. Dùng cho trường hợp «chúng tôi đã di chuyển trang này vĩnh viễn.» 302 Found cho các chuyển hướng tạm thời, trình duyệt không cache và công cụ tìm kiếm không chuyển xếp hạng. Chỉ dùng 302 khi lần di chuyển thực sự là tạm thời; mặc định dùng 302 thay vì 301 là một trong những sai lầm SEO tự làm hại mình phổ biến nhất.
Làm thế nào để bảo vệ thư mục bằng mật khẩu?
Tạo một tệp .htpasswd với tiện ích dòng lệnh htpasswd (nó lưu các dòng username:bcrypt-hash) và lưu trữ nó bên ngoài web root của bạn. Sau đó trong .htaccess: AuthType Basic, AuthName "Restricted Area", AuthUserFile /full/path/to/.htpasswd, Require valid-user. Trình duyệt hiển thị prompt Basic-auth hệ thống cho bất kỳ ai truy cập thư mục. Đây là mẫu Apache cổ điển; để xác thực nghiêm túc hãy cân nhắc hệ thống đăng nhập cấp ứng dụng.
Điều này có hoạt động trên WordPress không?
WordPress đi kèm khối .htaccess riêng (giữa các marker # BEGIN WordPress và # END WordPress) xử lý permalinks. WordPress sẽ ghi đè mọi thứ bên trong các marker đó khi bạn lưu cài đặt permalinks. Thêm các quy tắc của riêng bạn bên ngoài các marker WordPress (thường ở trên chúng) để chúng tồn tại qua quá trình tạo lại tự động.
Có gì được gửi đến máy chủ không?
Không. Generator là JavaScript lắp ráp các khối chỉ thị dựa trên các checkbox của bạn; đầu ra được xây dựng trong trình duyệt của bạn. Không có gì về domain hoặc các tùy chọn đã chọn của bạn rời khỏi trang; công cụ hoạt động ngoại tuyến sau khi đã tải.