Làm cách nào để chuyển hướng bất kỳ URL nào sang URL chữ thường?


7

Tôi đang dùng:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On   
    RewriteCond %{HTTP_HOST} ^example\.com [NC]
    RewriteRule (.*) http://example.com/$1 [L,R=301]
</IfModule>

Nhưng tôi muốn viết lại tất cả các ký tự viết hoa thành các ký tự chữ thường, ví dụ:

  • CŨ: /myfolder-sample-URL.html
  • MỚI: /myfolder-sample-url.html

Để thực hiện chuyển hướng như vậy bằng cách sử dụng mod_rewrite và .htaccess, bạn cần sử dụng lệnh RewriteMap không thể được đặt trong .htaccess - chỉ trong bối cảnh cấu hình máy chủ / Virtualhost. Bạn có quyền truy cập vào cấu hình máy chủ? Bạn có thể thay đổi nó? Nếu không - thì bạn chỉ có thể thực hiện nó khi thực thi trang thực tế (sử dụng PHP / ASP.NET, v.v.).
LazyOne

Cảm ơn bạn đã gợi ý, Có, tôi có quyền truy cập vào RewriteMap, vậy ... tôi nên làm gì bây giờ?
pelajar

Câu trả lời:


9

Để thực hiện chuyển hướng như vậy bằng cách sử dụng mod_rewrite và .htaccess, bạn cần sử dụng lệnh RewriteMapkhông thể được đặt trong .htaccess - chỉ trong bối cảnh cấu hình máy chủ / Virtualhost. Nếu bạn có quyền truy cập như vậy:

1. Đặt dòng này bên trong <VirtualHost>khối cho trang web của bạn:

RewriteMap lc int:tolower

2. Đặt cái này trong .htaccess của bạn:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule . ${lc:%{REQUEST_URI}} [R=301,L]

Điều này sẽ chuyển hướng (301 Chuyển hướng vĩnh viễn) bất kỳ URL nào có ít nhất 1 chữ in hoa (chỉ chữ Latinh) trong phần đường dẫn của URL (chuỗi truy vấn bị bỏ qua) về cùng nhưng trong trường hợp thấp hơn.

Ví dụ:

http://mydomain.com/myfolder-sample-URL.html
=> 
http://mydomain.com/myfolder-sample-url.html

http://mydomain.com/myfolder-sample-url.HTML
=> 
http://mydomain.com/myfolder-sample-url.html

nhưng sẽ không làm gì cho các URL này:

http://mydomain.com/myfolder-sample-url.html?say=MEOW
http://MYDOMAIN.com/myfolder-sample-url.html

Nếu bạn muốn giới hạn nó chỉ với các tệp .html:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^.+\.html$ ${lc:%{REQUEST_URI}} [NC,R=301,L]

Nơi đặt: Tôi sẽ đặt nó sau quy tắc chuyển hướng tên miền:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^domain\.com [NC]
RewriteRule (.*) http://mydomain.com/$1 [L,R=301]

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule . ${lc:%{REQUEST_URI}} [R=301,L]

# your other rules

Tôi cũng khuyên bạn nên sử dụng các liên kết rel = "canonical" :

<link rel="canonical" href="PROPER_URL_HERE" />

Nếu bạn không cần chuyển hướng, mà là khả năng phục vụ tệp bất kể trường hợp tên tệp (trường hợp tên tệp không nhạy cảm), thì bạn có thể sử dụng mod_spelling ( http://httpd.apache.org/docs/civerse/mod/mod_speling .html ) và CheckCaseOnly Onchỉ thị.


1
"Nếu bạn không cần chuyển hướng, ... bạn có thể sử dụng mod_spelling" - trên thực tế, mod_speling (một L) sẽ thực hiện chuyển hướng 301 đến tài liệu dự định.
MrWhite

2

Thêm phần này vào đầu .htaccess của bạn

NGUỒN: Htaccess để chuyển hướng chữ hoa thành chữ thường

RewriteEngine On
RewriteBase /

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

Ngoài ra, máy chủ của bạn có thể hỗ trợ mod_speling, trong đó nếu có, bạn có thể sử dụng trong cấu hình máy chủ, máy chủ ảo, thư mục hoặc trong tệp .htaccess, ví dụ bên dưới:

<IfModule mod_speling.c>
    CheckCaseOnly On
    CheckSpelling On
</IfModule>

3
Có lý do nào để thích sử dụng 26 quy tắc viết lại riêng biệt này trái ngược với phán quyết viết lại hai dòng sử dụng lc:từ câu trả lời của LazyOne không?
Stephen Ostermiller

1
Tùy thuộc vào tình huống, phiên bản tôi liệt kê chỉ yêu cầu trên htaccess tuy nhiên phiên bản ngắn hơn yêu cầu cả máy chủ ảo và htaccess vì RewriteMap lc int:toloweryêu cầu ban đầu .
Simon Hayter

Lý do tôi đăng câu trả lời này là vì tôi đã đóng một câu hỏi rất giống với yêu cầu phương pháp chỉ htaccess.
Simon Hayter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.