2010-06-21 6 views
6

Tôi đã có một trang web nơi tất cả các trang là tập lệnh php, vì vậy các URL kết thúc .php.Sử dụng mod_rewrite để ẩn .php từ cuối URL

Tôi đã thêm dòng sau vào file .htaccess, và bây giờ tôi có thể truy cập các tập tin .php mà không có phần mở rộng .php:

RewriteEngine On # Turn on rewriting 

RewriteCond %{REQUEST_FILENAME}.php -f # If the requested file with .php on the end exists 
RewriteRule ^(.*)$ $1.php # serve the PHP file 

Cho đến nay rất tốt. Nhưng bây giờ tôi muốn thêm một Chuyển hướng trên tất cả các tệp .php để bất kỳ liên kết cũ nào ngoài tầm kiểm soát của tôi được chuyển hướng đến phiên bản URL mới.

Tôi đã thử điều này:

RewriteEngine On # Turn on rewriting 

RewriteCond %{REQUEST_URI} .*\.php 
RewriteRule ^(.*)\.php$ http://example.com/$1 [R=permanent,L] 

RewriteCond %{REQUEST_FILENAME}.php -f # If the requested file with .php on the end exists 
RewriteRule ^(.*)$ $1.php [L] # serve the PHP file 

nhưng điều đó dường như để gửi một chuyển hướng ngay cả đối với các URL không kết thúc trong .php, vì vậy tôi gặp khó khăn trong một vòng lặp vô hạn. Bất kỳ sự kết hợp nào khác mà tôi thử dường như không khớp với yêu cầu nào (và để lại cho tôi ở page.php) hoặc tất cả các yêu cầu (và khiến tôi bị mắc kẹt trong một vòng lặp).

+1

Xem http://stackoverflow.com/questions/3024631/htaccess-remove-php-extension-index-php-and-add-trailing-slash/ – TheDeadMedic

Trả lời

7
RewriteEngine On 

RewriteCond %{THE_REQUEST} ^\w+\ /(.*)\.php(\?.*)?\ HTTP/ 
RewriteRule^http://%{HTTP_HOST}/%1 [R=301] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule .* $0.php 

Chỉ %{THE_REQUEST} không viết lại trong chuyển hướng nội điều đó xảy ra trong quy tắc thứ hai (%{REQUEST_URI}, mặt khác, là).

0

Bạn chuyển hướng trang kết thúc với .php vào trang bất .php

Sau đó, quy tắc đầu tiên của bạn rewites tất cả các trang không kết thúc với .php để tên trang kết thúc với .php

Đây là lý do tại sao bạn có một vòng lặp :-)

+0

Tôi đã viết lại câu hỏi bằng tệp .htaccess của mình trong đầy. Quy tắc bổ sung .php sẽ xuất hiện sau khi quy tắc xóa nó và chuyển hướng. AFAICS, có điều gì đó sai với RewriteCond – rjmunro

0

Thêm NS các thông số danh sách mà quy tắc cuối cùng

+0

Tôi nghĩ rằng điều đó cũng có hiệu quả, nhưng nó dường như không hoạt động. Ngoài ra, với điều kiện 'RewriteCond% {IS_SUBREQ} = false', tôi nhận được' [localhost/sid # 1fd6de0] [thoát # 5aa2e20/initial/redirect # 1] (4) [perdir U:/htdocs /] RewriteCond: input = 'false' pattern = '= false' => trùng khớp' – Artefacto

+0

Điều đó không hiệu quả đối với tôi. – rjmunro

0

Bạn có thể có thể cũng để thêm [L] đến RewriteRule để thêm .php, do đó nó dừng lại quá trình ing Quy tắc khác:

RewriteRule ^(.*)$ $1.php [L] # serve the PHP file 
+0

Tôi đã thử điều này và nó không có sự khác biệt. Tôi đã thêm nó vào phiên bản trong câu hỏi để tiết kiệm sự mơ hồ. – rjmunro

0

Nhờ một con trỏ đến this question bởi @TheDeadMedic, tôi đã có thể tìm ra giải pháp cho vấn đề của riêng tôi bằng cách thay đổi:

RewriteCond %{REQUEST_URI} .*\.php 

tới:

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP 

Tôi không hiểu tại sao phiên bản của tôi không làm điều tương tự.

+0

Xem câu trả lời của tôi. Giải pháp của bạn chỉ hơi khác (chỉ hoạt động cho các yêu cầu GET). – Artefacto