2013-08-23 42 views
71

Lời xin lỗi của tôi cho câu hỏi 10000000 về chủ đề này, nhưng tôi không thể làm cho nó hoạt động theo cách tôi muốn.Chuyển hướng tất cả đến index.php htaccess

Tôi đang viết một khung mvc'ish php đơn giản. Tôi muốn khung này có thể được cài đặt trong bất kỳ thư mục nào.

Tập lệnh php của tôi làm gì: Lấy uri yêu cầu và chia nhỏ thành các phân đoạn. Làm cho phân khúc 1 bộ điều khiển và phân đoạn 2 hành động. Điều này đi tất cả tiền phạt khi tôi làm điều này:

http://www.domain.com/mvc/module/test/

Nó sẽ đi đến bộ điều khiển mô-đun cụ thể và phương pháp. Bây giờ tôi có một bộ điều khiển mặc định, bộ điều khiển trang chủ nằm trong thư mục chính.

Bây giờ khi tôi acces thư mục này trực tiếp http://www.domain.com/mvc/home/ Nó sẽ hiển thị một 403 bị cấm, bởi vì thư mục này không tồn tại, thay vào đó nó cũng nên trở về http://www.domain.com/mvc/index.php

Nếu tôi đã có thể cài đặt khung trong một thư mục khác nhau, cho phép nói khung thư mục, nó phải chuyển hướng trở lại http://www.domain.com/framework/index.php

Tôi muốn chuyển hướng mọi thư mục và tệp php trở lại index.php, để mọi thứ khác theo cách đó.

Vấn đề đầu tiên tôi gặp phải là nó không bao giờ chuyển hướng đến thư mục bên phải, luôn luôn đến thư mục gốc của miền.

Đây là những gì tôi đã cố gắng:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . index.php [L] 

Tôi thực sự hy vọng ai đó có thể giúp tôi ra hoặc điểm tôi vào đúng hướng!

Cảm ơn rất nhiều !!

+0

Chỉ cần đảm bảo rằng tôi hiểu đúng câu hỏi của bạn: bạn muốn chuyển hướng mọi yêu cầu đến _root_ 'index.php' hoặc bạn muốn chuyển hướng mọi yêu cầu được thực hiện cho _that thư mục cụ thể's' 'index.php'? – Technoh

+0

Vào thư mục chứa tập tin htaccess, thư mục gốc của khung công tác. Trong ví dụ của tôi quay lại thư mục mvc –

Trả lời

145

Quy tắc viết lại của bạn trông gần như ổn.

Trước tiên hãy đảm bảo rằng tệp .htaccess của bạn nằm trong thư mục gốc của tài liệu (cùng một vị trí như index.php) hoặc nó sẽ chỉ ảnh hưởng đến thư mục con trong (và bất kỳ thư mục con nào trong đó - đệ quy).

Tiếp theo thực hiện một thay đổi nhỏ đối với quy tắc của bạn để nó trông giống như sau:

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

Tại thời điểm bạn chỉ cần phù hợp với trên . đó là một thể hiện của bất kỳ nhân vật, bạn cần ít nhất .* để khớp với bất kỳ số lượng cá thể nào của bất kỳ ký tự nào.

Biến số $_GET['path'] sẽ chứa cấu trúc thư mục giả, do đó, ví dụ /mvc/module/test, sau đó bạn có thể sử dụng trong chỉ mục.php để xác định Bộ điều khiển và các tác vụ bạn muốn thực hiện.


Nếu bạn muốn toàn bộ công việc được cài đặt trong một thư mục phụ, chẳng hạn như /mvc/ hoặc /framework/ cách tối thiểu phức tạp để làm điều đó là thay đổi quy tắc viết lại một chút đi mà vào tài khoản.

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA] 

Và đảm bảo rằng index.php của bạn là trong thư mục đó trong khi các tập tin .htaccess là trong thư mục gốc tài liệu.


Thay thế cho $_GET['path'] (cập nhật tháng hai '18)

Đó không phải là thực sự cần thiết (thậm chí cũng không phổ biến hiện nay) để thiết lập các đường như là một biến $_GET, nhiều khung sẽ dựa vào $_SERVER['REQUEST_URI'] để lấy thông tin tương tự - thông thường để xác định Bộ điều khiển nào để sử dụng - nhưng nguyên tắc chính xác là giống nhau.

này đơn giản hóa việc RewriteRule nhẹ là bạn không cần phải tạo ra các đường tham số:

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

Các quy tắc tương tự về việc cài đặt trong một thư mục con vẫn áp dụng, ví dụ

RewriteRule ^.*$ /mvc/index.php [L,QSA] 



Cờ:

NC = Không có Case (không phân nhạy cảm, không thực sự cần thiết vì không có nhân vật trong các mô hình)

L = Cuối cùng (nó sẽ ngừng viết lại sau khi viết lại này để đảm bảo rằng nó là la st điều trong danh sách viết lại của bạn)

QSA = Chuỗi truy vấn Apend, chỉ trong trường hợp bạn có thứ gì đó như ?like=penguins ở cuối, bạn muốn giữ và chuyển đến index.php.

+0

nó phải là index.php? Path = $ 1 – Prozi

+1

@Prozi không nếu bạn đang ở trong một thư mục con và * index.php * nằm trong docroot, thì bạn cần hàng đầu/- với 'Options + Indexes' và * index.php * có trong' DirectoryIndex' bạn * có thể * bỏ đi * index.php * hoàn toàn và chỉ sử dụng '/? path = $ 1' Điều này đúng khi viết lại thông qua .htaccess thay vì trong chỉ thị loại httpd-vhosts.conf ''. – CD001

+0

Nếu bạn sử dụng nó và dựa vào $ _GET ['path'] bạn sẽ gặp rắc rối trong trường hợp di chuyển đến máy chủ nginx ... – barell

13

Bạn có thể sử dụng một cái gì đó như thế này:

RewriteEngine on 
RewriteRule ^.+$ /index.php [L] 

này sẽ chuyển hướng tất cả các truy vấn để index.php vào thư mục gốc của. Lưu ý rằng nó cũng sẽ chuyển hướng truy vấn cho các tệp tồn tại, chẳng hạn như hình ảnh, tệp javascript hoặc trang tính kiểu.

18

Để chuyển hướng tất cả mọi thứ mà doesnt tồn tại để index.php, bạn cũng có thể sử dụng FallBackResource chỉ

FallbackResource /index.php 

Nó hoạt động giống như ErrorDocument, khi bạn yêu cầu một con đường không tồn tại hoặc tập tin trên máy chủ, chỉ thị âm thầm yêu cầu cho index.php.

Nếu bạn muốn chuyển hướng tất cả mọi thứ (including existant files or folders) để index.php, bạn có thể sử dụng giống như sau:

RewriteEngine on 

RewriteRule ^((?!index\.php).+)$ /index.php [L] 

Lưu ý mô hình ^((?!index\.php).+)$ khớp với bất kỳ uri trừ index.php chúng tôi đã loại trừ đường dẫn đích để ngăn chặn vòng lặp vô hạn lỗi.

+0

Nhưng bạn cũng có thể muốn sử dụng: 'DirectoryIndex index.php' – Shao

+0

Xấu nó sẽ gửi lỗi 404 cho tôi. – Soaku

2

Silly câu trả lời nhưng nếu bạn không thể tìm ra lý do tại sao nó kiểm tra không chuyển hướng rằng sau được bật cho thư mục web ..

AllowOverride All

này sẽ cho phép bạn chạy htaccess mà phải chạy ! (Có lựa chọn thay thế nhưng không phải trên sẽ gây ra vấn đề https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride)

2

Có một "lừa" cho vấn đề này phù hợp với tất cả các kịch bản, một giải pháp như vậy rõ ràng rằng bạn sẽ phải thử nó để tin rằng nó thực sự hoạt động .. . :)

Dưới đây là ...

<IfModule mod_rewrite.c> 

    RewriteEngine On 

    RewriteCond %{REQUEST_FILENAME} -f [OR] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php [L,QSA] 

</IfModule> 

về cơ bản, bạn đang yêu cầu mod_rewrite để chuyển tiếp để index.php yêu cầu URI luôn khi một tập tin tồn tại AND luôn khi tệp được yêu cầu không tồn tại!

Khi điều tra mã nguồn của MOD-REWRITE để hiểu cách hoạt động, tôi nhận thấy rằng tất cả các kiểm tra của nó luôn xảy ra sau khi xác minh nếu tệp được tham chiếu tồn tại hay không. Chỉ khi đó, RegEx mới được xử lý. Ngay cả khi URI của bạn trỏ đến một thư mục, Apache sẽ thực thi kiểm tra cho các tệp chỉ mục chỉ mục được liệt kê trong tệp cấu hình của nó. Dựa trên phát hiện đơn giản đó, rõ ràng là việc xác thực tệp đơn giản sẽ đủ cho tất cả các cuộc gọi có thể, khi chúng tôi nhấn đúp vào kiểm tra sự hiện diện tệp và định tuyến cả hai kết quả đến cùng một điểm kết thúc, bao gồm 100 % khả năng.

QUAN TRỌNG: Lưu ý rằng không có "/" trong index.php. Theo mặc định, MOD_REWRITE sẽ sử dụng thư mục được đặt làm "thư mục cơ sở" cho chuyển tiếp. Vẻ đẹp của nó là nó không nhất thiết cần phải là "thư mục gốc" của trang web, cho phép giải pháp này làm việc cho localhost/ và/hoặc bất kỳ thư mục con nào bạn áp dụng nó.

Cuối cùng, một số giải pháp khác mà tôi đã thử nghiệm trước đây (những thứ dường như hoạt động tốt) đã phá vỡ khả năng PHP "yêu cầu" một tệp thông qua đường dẫn tương đối của nó, đó là một con số thấp. Hãy cẩn thận.

Một số người có thể nói đây là giải pháp không phù hợp. Nó có thể được, thực sự, nhưng theo như kiểm tra, trong một số kịch bản, một số máy chủ, một số phiên bản Apache khác nhau, vv, giải pháp này đã làm việc 100% trên tất cả các trường hợp!

Các vấn đề liên quan