Làm cách nào để làm cho tất cả các URL chạy qua một tệp PHP?


9

Làm thế nào để các hệ thống MVC có các url trong các biểu mẫu này buộc tất cả các yêu cầu thông qua một tệp index.php?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

EDIT: Khi tôi thử các quy tắc viết lại bên dưới, tôi gặp lỗi này:

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

EDIT: Ồ, đây là nội dung đầy đủ của /index.php. Khi tôi xóa các quy tắc viết lại, nó sẽ xuất ra '/' hoặc '/index.php' hoặc tôi nhận được 404 cho bất cứ điều gì khác.

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

GIẢI QUYẾT: Tôi đã thêm một / phía trước index.php trong quy tắc viết lại và sau đó nó hoạt động:

GIẢI QUYẾT LẠI: Hóa ra / chỉ cần thiết vì tôi đang chạy 2.2.4. Khi tôi nâng cấp lên 2.2.11, / không còn cần thiết nữa.


Những bộ quy tắc bạn đã sử dụng? Tôi đã thử cả hai và cả hai đều hoạt động tốt. Bạn có chắc chắn đã kích hoạt mod_rewrite?
Manuel Faux

Máy chủ sẽ không khởi động nếu mod_rewrite không hoạt động. Đây là Apache 2.2 trên WinXP nếu có vấn đề.
jmucchiello

Câu trả lời:


12

Nếu bạn đang sử dụng Apache, hãy sử dụng viết lại qua mod_rewrite:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

Điều này sẽ viết lại URL của bạn thành »index.php? Q = foo / bar / baz« trong suốt.

Các dòng 2. và 3. yêu cầu công cụ viết lại không viết lại URL nếu nó trỏ đến một tệp hoặc thư mục hiện có. Điều này là cần thiết để có quyền truy cập vào các tệp thực được cung cấp bởi máy chủ httpd.


Xem chỉnh sửa ở trên. Nhận lỗi 400.
jmucchiello

Yêu cầu chính xác mà bạn gửi đến máy chủ là gì? Máy chủ của bạn đã cài đặt mod_rewrite chưa? Tôi đoán vậy, vì nếu không nó sẽ không bắt đầu vì lỗi cú pháp.
Manuel Faux

Bản chỉnh sửa hiển thị yêu cầu chính xác: localhost: 8181localhost: 8181 / abc . Nếu tôi loại bỏ các quy tắc viết lại, tôi nhận được index.php của tôi với / và 404 bình thường với / abc.
jmucchiello

Tôi đã thêm một / phía trước index.php và nó đã khắc phục vấn đề.
jmucchiello

Bí ẩn ... Tôi đã thử nghiệm mà không có dấu gạch chéo và nó hoạt động với tôi với apache-2.2.11-8.
Manuel Faux

1

Mã dưới đây sử dụng mod_rewrite của Apache để viết lại tất cả các URL không trỏ đến tệp hoặc thư mục vật lý được ánh xạ tới tệp index.php. Kết quả cuối cùng sẽ là:

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

Viết lại quy tắc:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Giải trình:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Cả hai dòng trên đều cho rằng quy tắc này không áp dụng cho các tệp thông thường (-f) hoặc thư mục (-d).

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Thông tin thêm về cách tạo quy tắc mod_rewrite có thể được thu thập từ trang web Apache: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .


Xem chỉnh sửa ở trên. Nhận lỗi 400.
jmucchiello

Tôi ước tôi có thể đặt cả hai câu trả lời là đúng.
jmucchiello
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.