Có một vài vấn đề ở đây ...
Trong một thư mục .htaccess
bối cảnh, đường dẫn URL phù hợp với viết lại quy tắc
mẫu không bao giờ bắt đầu bằng dấu gạch chéo, vì vậy regex ^/(.*):(.*)
sẽ không bao giờ khớp và chỉ thị không làm gì cả. Nên viết lại quy tắc
mẫu sẽ cần phải được ^(.*):(.*)
- không có tiền tố dấu gạch chéo.
- Tuy nhiên, regex này rất tổng quan và có lẽ là phù hợp nhất quá nhiều. Nếu bạn đang mong đợi một yêu cầu của mẫu
/1:1
, I E. /<số>:<số>
sau đó sử dụng một biểu thức chính quy cụ thể hơn, vd. ^\d+:\d+$
Vì bạn đang nhận được 403 Bị cấm (trái ngược với 404 Không tìm thấy), tôi cho rằng bạn đang sử dụng máy chủ Windows. "Vấn đề" ở đây là :
(dấu hai chấm) không phải là ký tự hợp lệ trong tên tệp Windows. Đây là một vấn đề với .htaccess
bởi vì yêu cầu được ánh xạ tới hệ thống tập tin trước .htaccess
(và mod_rewrite) được xử lý - tại thời điểm đó, lỗi 403 được kích hoạt. Thay vào đó, bạn sẽ cần phải viết lại yêu cầu trong cấu hình máy chủ chính (hoặc bộ chứa VirtualHost) - điều này xảy ra trước yêu cầu được ánh xạ tới hệ thống tập tin.
Vì vậy, những gì bạn đang cố gắng thực hiện... viết lại yêu cầu có chứa dấu hai chấm, sử dụng .htaccess
trên máy chủ Windows là không thể. Bạn có thể làm điều này trên Linux (cho phép có dấu hai chấm trong tên tệp) HOẶC trong cấu hình máy chủ chính (người phục vụ hoặc Máy chủ ảo ngữ cảnh) trên Windows, nhưng không ở .htaccess
.
Khi sử dụng mod_rewrite trong một người phục vụ (hoặc Máy chủ ảo) bối cảnh (trái ngược với .htaccess
) bạn làm cần tiền tố dấu gạch chéo (trên cả hai mẫu và thay thế dây). Ví dụ:
# Trong bối cảnh "máy chủ" (hoặc "máy chủ ảo"),
# không phải ".htaccess" (hoặc phần "<Directory>" trong cấu hình máy chủ)
Viết LạiEngine Trên
# Viết lại nội bộ "/1:1" thành thông tin đường dẫn trên "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
Các $0
phản hồi chứa toàn bộ đường dẫn URL được ghi lại bởi viết lại quy tắc
mẫu. Điều này bao gồm tiền tố dấu gạch chéo (khi được sử dụng trong người phục vụ ngữ cảnh), đó là lý do tại sao dấu gạch chéo bị bỏ qua trong thay thế chuỗi.
CẬP NHẬT:
Tôi đã thực hiện các thay đổi, vui lòng xem lại câu hỏi của tôi và xem, tôi đã nhập chính xác
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride all
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
Bạn dường như không thực hiện bất kỳ thay đổi nào; ít nhất là không ở đúng phần? Như đã đề cập ở trên, các chỉ thị này cần được thêm trực tiếp vào <VirtualHost>
vùng chứa (mà bạn đã đăng). Chúng không thể được thêm vào .htaccess
trên HĐH Windows - đơn giản là chúng sẽ không làm gì cả và bạn sẽ nhận được phản hồi 403 Forbidden như đã nêu.
Ở trên nên được viết như thế này:
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
# Enable the rewrite engine in a virtualhost context
RewriteEngine On
# Internally rewrite "/1:1" to path-info on "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
<Directory "${INSTALL_DIR}/www/">
Options -Indexes -Includes +FollowSymLinks -MultiViews
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
Bạn sẽ cần khởi động lại Apache để những thay đổi này có hiệu lực. (Không giống .htaccess
các tệp được giải thích trong thời gian chạy.)
Tuy nhiên, bạn có những chỉ thị nào khác trong .htaccess
và các URL khác của bạn được định tuyến như thế nào? Bạn đã đăng chỉ thị sau trong phần bình luận:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Điều này định tuyến URL hoàn toàn khác với những gì bạn đang yêu cầu trong câu hỏi của mình. Trong câu hỏi của bạn, bạn đang chuyển đường dẫn URL dưới dạng thông tin đường dẫn bổ sung tới index.php
. Tuy nhiên, trong lệnh này, bạn đang chuyển URL như một phần của chuỗi truy vấn? Làm thế nào để những liên quan? Tại sao chúng khác nhau? Rõ ràng là bạn cần chuyển URL theo cách mà "ứng dụng MVC" của bạn đang mong đợi.