2012-03-14 34 views
12

Làm thế nào tôi có thể định tuyến lại tất cả các yêu cầu cho các trang php thông qua index.php?Định tuyến lại tất cả các yêu cầu php thông qua index.php

.htaccess của tôi là như sau:

Options +FollowSymLinks 
IndexIgnore */* 
#Turn on the RewriteEngine 
RewriteEngine On 
# Rules 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !.*\.(js|ico|gif|jpg|png|css|pdf)$ index.php%{REQUEST_URI} [L] 

Về cơ bản, tôi đang cố gắng để bắt chước NET trang chủ. Index.php có đầu trang/chân trang của trang web.

Chuyển hướng 404 đến index.php. Làm thế nào tôi có thể làm cho nó chuyển hướng tất cả các yêu cầu đến các trang php (ngoại trừ index.php chính nó)?

Có vấn đề về hiệu suất nào với phương pháp này (không muốn sử dụng khung công tác) không?

+1

On Mod-Rewrite: http://stackoverflow.com/questions/8440490/ pretty-urls-in-php-frameworks - Về hiệu suất: http://stackoverflow.com/questions/8145128/htaccess-mod-rewrite-performance –

Trả lời

19

Dưới đây là những gì tôi sử dụng (và đã sử dụng cho các lứa tuổi):

<IfModule mod_rewrite.c> 
    # Redirect /index.php to/(optional, but recommended I guess) 
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*index\.php 
    RewriteRule ^index.php/?(.*)$ $1 [R=301,L] 

    # Run everything else but real files through index.php 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php/$1?%{QUERY_STRING} [L] 
</IfModule> 

Theo các ý kiến ​​đề nghị nó sẽ lộ mọi yêu cầu đó không phải là một tập tin thực tế để index.php

+0

Phần chính có vẻ tốt (và phù hợp với những gì tôi làm), nhưng tôi không thấy điểm nào trong phần đầu tiên định tuyến '/ index.php' đến'/'. Bởi vì trong chỉ mục 'của bạn.Tệp php' (xử lý ** tất cả các tuyến **, bao gồm 'index.php'), nếu bạn không muốn hiển thị nội dung cho'/index.php', chỉ cần 404 .... –

+2

Lý do để bao gồm để trang chủ của bạn không khả dụng trên nhiều URL. mysite.com/ và mysite.com/index.php không nên tồn tại vì bạn có thể bị phạt vì nội dung trùng lặp. – powerbuoy

+0

Bạn có thể ném một 302 cho '/ index.php' để chuyển hướng trở lại'/'. – FakeRainBrigand

4
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !index\.php$ 
RewriteRule .*\.php$ index.php?q=%{REQUEST_URI} [L] 

sẽ bắt tất cả các yêu cầu kết thúc bằng .php mà không trỏ đến một tập tin kết thúc bằng index.php và chuyển hướng họ đến index.php trong tham số get q

+1

Nếu bạn không có thư mục/miền tĩnh, có lẽ bạn nên nói viết lại các tệp không phải. Nếu bạn không muốn gửi một tệp; xóa quyền đọc. Bằng cách đó hiện có css/js/bất kỳ tập tin sẽ được gửi. Các tệp ảo sẽ được xử lý bởi tập lệnh PHP. – FakeRainBrigand

+1

+1 vì tôi biết bạn đúng. Đây là những gì op hỏi cho dù. – bkconrad

8

sử dụng:

 

    
     RewriteEngine On 
     RewriteBase/
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteCond $1 !^(index\.php|public|css|js|robots\.txt) 
     RewriteRule ^(.*)$ index.php/params=$1 [L,QSA] 
    

    
     ErrorDocument 404 /index.php 
    

Url sample: www.site.com/friend/josh/03-13-2012

Vì vậy, $ params var giá trị:

bạn bè/josh/03-13-2012

Chỉ cần explode() "/" để u có được mảng với params:

array(
0 => friend 
1 => josh 
2 => 03-13-2012 
) 
+0

Trên apache 2.4 câu trả lời của bạn làm việc cho tôi với những thay đổi tiếp theo: trên RewriteCond $ 1 ..... Tôi đã viết thay vì $ 1% này: {REQUEST_FILENAME}. Tôi cũng đã thêm cờ END: [END, L, QSA] – besciualex

0

để chuyển hướng tất cả các yêu cầu không tồn tại để /index.php, Bạn cũng có thể sử dụng các chỉ dẫn ErrorDocumentFallbackResource.

Hãy thử một trong các ví dụ sau:

ErrorDocument 404 /index.php 


FallbackResource /index.php 

Những chỉ thị này là một phần của mô-đun lõi apache và bạn không cần phải kích hoạt mod-viết lại để sử dụng chúng.

Nếu bạn đang tìm kiếm một cách để chuyển hướng tất cả các yêu cầu (bao gồm cả các file thực/dirs) sau đó thử Redirect sau

RedirectMatch ^/(?!index\.php).+)$ /index.php 
Các vấn đề liên quan