.htaccess Chuyển hướng 301 với dấu gạch chéo thêm dấu gạch chéo vào đích

Oct 11 2020

Trang web của tôi vừa được thực hiện lại và tôi đang cố gắng thiết lập chuyển hướng trong tệp .htaccess cho các liên kết đã thay đổi

Điều này hoạt động tốt, ngoại trừ nó không hoạt động đối với /example/(với dấu gạch chéo trên đường dẫn nguồn)

Redirect 301 /example /example.php

Vì vậy, tôi đã thêm điều này vào tài khoản cho dấu gạch chéo sau:

Redirect 301 /example/ /example.php

Nhưng điều đó chuyển hướng đến example.php/(thêm dấu gạch chéo vào đích, không hoạt động)

Rõ ràng là tôi đang làm sai. Cách tốt hơn là gì?

Trả lời

4 MrWhite Oct 12 2020 at 01:21

Nhưng điều đó chuyển hướng đến example.php/

Điều đó được gây ra bởi quy tắc đầu tiên (ban đầu). Lưu ý rằng 301 sớm hơn (có lỗi) có thể đã được trình duyệt lưu vào bộ nhớ cache. Thử nghiệm với chuyển hướng 302 (tạm thời) để tránh các vấn đề tiềm ẩn trong bộ nhớ đệm.

Lệnh Redirectlà đối sánh tiền tố (toàn bộ phân đoạn đường dẫn) và mọi thứ sau đối sánh được nối vào cuối URL mục tiêu. Vì vậy, chỉ thị đầu tiên chuyển hướng:

  • /example đến /example.php
  • /example/đến /example.php/
  • /example/abc đến /example.php/abc

Nếu các lệnh được sắp xếp như thế này thì chúng sẽ "hoạt động" đối với hai URL mẫu đã đăng:

Redirect 301 /example/ /example.php
Redirect 301 /example /example.php

Tuy nhiên, Redirectchỉ thị không thực sự là chỉ thị chính xác để sử dụng ở đây, vì bạn cần hai chỉ thị để xử lý điều này. (Nói chung, với lệnh Redirectnày, bạn cần phải bao gồm hoặc loại trừ dấu gạch chéo trên cả URL nguồn và URL đích.)

RedirectMatchThay vào đó, bạn có thể sử dụng chỉ thị, lệnh này phù hợp với việc sử dụng regex. Ví dụ: để xử lý cả có và không có dấu gạch chéo sau:

RedirectMatch 301 ^/example/?$ /example.php

Điều này chỉ khớp với /examplehoặc /example/và chuyển hướng đến /example.php.

RedirectRedirectMatchđều là một phần của mod_alias.

Tuy nhiên, nếu bạn đang sử dụng mod_rewrite thì hãy cân nhắc sử dụng mod_rewrite RewriteRulethay thế để tránh xung đột tiềm ẩn, vì mod_rewrite luôn chạy trước mod_alias, bất chấp thứ tự rõ ràng của các lệnh trong .htaccess. Ví dụ:

RewriteEngine On

RewriteRule ^example/?$ /example.php [R=301,L]

Lưu ý rằng không có tiền tố dấu gạch chéo trên RewriteRule mẫu khi được sử dụng .htaccessvì đường dẫn URL mà mẫu đối sánh đã bị xóa tiền tố thư mục (luôn kết thúc bằng dấu gạch chéo).

Cũng lưu ý rằng thứ tự của các chỉ thị trong mỗi mô-đun có thể quan trọng.

Ngoài ra: Nếu bạn đã "làm lại" trang web của mình, tại sao lại là các URL "mới" của biểu mẫu /example.php? Điều này dường như sẽ là lạc hậu?


CẬP NHẬT: Tôi đã có người chuyển đổi trang web wordpress ban đầu thành một trang web tương đương (gần như) chỉ sử dụng HTML và một chút javascript và php

Bạn có thể giữ các URL gốc của WordPress (ví dụ. /example) Và viết lại nội bộ yêu cầu vào tệp cơ bản xử lý yêu cầu (ví dụ example.php:) thay vì chuyển hướng bên ngoài . Đối với điều này, bạn sẽ cần phải sử dụng mod_rewrite. Bạn cũng cần phải liên kết đến các URL WordPress "cũ" trong nguồn HTML của mình. ví dụ. /example(và xem xét việc chuẩn hóa dấu gạch chéo sau - chuyển hướng đến cái này hoặc cái kia).

Để viết lại /example (hoặc /example/) nội bộ , /example.phpbạn chỉ cần xóa Rcờ khỏi lệnh trên RewriteRule. Ví dụ:

RewriteRule ^example/?$ example.php [L]

(Tôi cũng đã xóa tiền tố dấu gạch chéo trên phần RewriteRule thay thế , hiện không cần thiết vì chúng tôi đang viết lại đường dẫn hệ thống tệp.)

Cung cấp cho bạn liên kết đến /exampletrong nguồn HTML của bạn thì người dùng không biết rằng yêu cầu thực sự được ánh xạ tới example.php.