2011-02-05 41 views
36

Tôi muốn một bộ quy tắc mod_rewrite để tôi có thể tham khảo một trang không có phần mở rộng .php nhưng đã viết lại để bao gồm phần mở rộng php. Thao tác này sẽ chạy trên máy chủ 1 & 1.Xóa phần mở rộng .php bằng mod_rewrite

Có bất kỳ tài liệu tham khảo nào tốt để tôi có thể tự học thêm không?

+0

bản sao có thể có của [Tạo ghi đè loại bỏ phần mở rộng .php?] (Http: // stackoverflow.com/questions/781738/make-a-rewriterule-remove-php-mở rộng) –

+4

Hãy nhớ rằng bạn đang tạo tài nguyên cố định cho phần còn lại của web khi bạn đặt câu hỏi và nhận câu trả lời của người khác. Sử dụng tiêu đề câu hỏi có ý nghĩa và không viết nội dung như thể đó là thư cá nhân. –

+0

bản sao có thể có của [Cách xóa tiện ích mở rộng tệp khỏi địa chỉ trang web? (ảnh mẫu đính kèm)] (http://stackoverflow.com/questions/6534904/how-to-remove-file-extension-from-website-address-sample-photos-attached) –

Trả lời

48
RewriteEngine On 
RewriteRule something something.php [L] 

http://example.com/something sẽ được xử lý như thể nó là một yêu cầu cho something.php

Để chuyển hướng mọi yêu cầu mà không phải là một tập tin vật lý để cùng tên nhưng với .php:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) $1.php [L] 
+0

Tuyệt vời, tôi có thể xác nhận rằng các công trình , nhưng làm cách nào để tôi làm điều này nói chung cho tất cả các trang? Nó cũng sẽ được tốt đẹp nếu contact.php được chuyển hướng để chỉ "liên hệ". – James

+0

Vâng, bạn cần xác định và mã hóa ánh xạ giữa URI và tệp vật lý. Tôi đã chỉnh sửa câu trả lời của tôi để cung cấp cho bạn một ví dụ. Nếu bạn muốn contact.php chuyển hướng đến địa chỉ liên hệ, sau đó liên hệ với 'RewriteRule contact.php [R = 301, L]'. Để chuyển hướng tất cả các yêu cầu kết thúc bằng .php, 'RewriteRule (. *) \. Php $ 1 [R = 301, L]'. Lưu ý việc sử dụng R = 301 để buộc chuyển hướng HTTP 301 vĩnh viễn, khiến trình duyệt gửi yêu cầu HTTP mới cho URL mới, do đó sẽ kích hoạt quy tắc của bạn ánh xạ URL trở lại tệp .php thực sự xử lý nó. –

+0

Tôi đang làm chính xác điều này: 'RewriteRule (. *) \. Php/$ 1 [R = 301, L]' 'RewriteCond% {REQUEST_FILENAME}! -d' ' RewriteCond% {REQUEST_FILENAME}! -f' 'RewriteRule^([A-Za-z0-9 -] *) $ $ 1.php [L]' Và kết thúc bằng một vòng lặp chuyển hướng. – Mauro

2

Có lẽ những gì bạn thực sự muốn chỉ là một cách để không có hậu tố ở tất cả. Các cách tốt nhất mà tôi đã tìm thấy để làm điều này là sử dụng các chỉ thị tập tin trong .htaccess hoặc trong file cấu hình apache:

<Files myscript> 
    SetHandler cgi-script 
</Files> 

Điều này tránh một số nhược điểm của viết lại, ví dụ, truy cập trực tiếp của. php tệp.

0

Đối với một số lý do tôi đã không thể nhận được bất kỳ giải pháp khác hoạt động bình thường. Tôi đặt tệp này vào một tệp .htaccess tại thư mục gốc của trang web của tôi. Hy vọng rằng điều này sẽ làm việc cho bạn.

RewriteEngine on #only use this once per .htaccess 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

Điều quan trọng cần lưu ý là nếu tiêu đề hoặc URL của bạn chứa phần mở rộng .php, nó sẽ không bị xóa. Bạn cần xóa tiện ích.

Sử dụng này ...

header 'location: /login'; 

hơn này ...

header 'location: /login.php'; 
9

Câu trả lời được chấp nhận trên không loại bỏ các phần mở rộng .php từ url nó chỉ cho phép bạn đến thăm .php tập tin mà không sự mở rộng. Để loại bỏ phần mở rộng .php hoàn toàn từ url, bạn có thể sử dụng các quy tắc sau đây trong root/.htaccess:

RewriteEngine on 

#1)externally redirect "/file.php" to "/file" 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] 
RewriteRule^/%1 [NC,L,R] 
#2)Internally map "/file" back to "/file.php" 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*?)/?$ /$1.php [NC,L] 
0

Đối với chỉ đạo một vài tập tin duy nhất nó có thể được dễ dàng hơn để tránh những RewriteEngine.

Tôi đã sử dụng này:

<Files $filename> 
    SetHandler application/x-httpd-php 
</Files> 

Đó là chưa mạnh mẽ và linh hoạt hơn so với viết lại nhưng có lẽ nhanh hơn và có vẻ như con đường để đi nếu bạn muốn chỉ có một vài tác phẩm cụ thể xử lý như PHP.

2

.file .htaccess: thêm các dòng sau:

Options +MultiViews 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 

https://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/

Bây giờ bạn sẽ phải kiểm tra các điều kiện AllowOverride trong tập tin apache2.log: bộ tùy chọn AllowOverride All trong thư mục gốc web của bạn:

Options Indexes FollowSymLinks 
    AllowOverride All 
    Require all granted 

Nếu bạn cố truy cập trang web của mình mà không có phần mở rộng .php, bạn có thể gặp phải lỗi sau trong tệp apache error.log: /var/www/html/web/.htaccess: Lệnh không hợp lệ 'RewriteEngine', có lẽ sai chính tả hoặc được xác định bởi một mô-đun không có trong cấu hình máy chủ

Để khắc phục điều này: Bạn chưa cài đặt mô-đun mod_rewrite, để cài đặt nó: Chạy lệnh sau: ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration

Một lần nữa, sau khi làm mới trang web, bạn có thể gặp lỗi nhấp chuột trong tệp error.log:

[negotiation:error] [pid 4650] [client 127.0.0.1:46461] AH00687: Negotiation: discovered file(s) matching request: /var/www/html/web/test (None could be negotiated). (I was trying to access localhost/web/test.php using the url: localhost/web/test) 

Để khắc phục nó, bạn sẽ có thêm những dòng sau đây trong apache2.conf:

<IfModule mod_mime.c> 
AddType application/x-httpd-php .php 
AddType application/x-httpd-php .phtml 
AddType application/x-httpd-php .php3 
AddType application/x-httpd-php .php4 
AddType application/x-httpd-php .html 
AddType application/x-httpd-php-source .phps 

https://forums.digitalpoint.com/threads/htaccess-addtype-application-x-httpd-php-php-htm-html-and-maybe-a-fix.7584/#post-2491687

Bây giờ, tôi có thể truy cập các tập tin test.php chỉ sử dụng tên tập tin: kiểm tra

0

Tùy chọn này sẽ làm cho URL thân thiện với SEO sạch sẽ. Tiện ích removeing.php từ URL hiển thị và đảm bảo rằng URL được truy cập mà không có tệp .php sẽ vẫn hiển thị tệp .php. Tôi đã không thể tìm thấy một câu trả lời khác đã đạt được điều này trên nhiều chủ đề.

Hãy nhớ bật ghi đè mod. Trên Debian hoặc Linux Unbuntu sau đây sẽ làm việc

sudo a2enmod viết lại

dịch vụ sudo apache2 restart

Sửa đổi các phần tương ứng của file apache2.conf của bạn như sau.

<Directory /var/www/> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Require all granted 
     RewriteEngine On 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteRule (.*) $1.php [L] 
     RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] 
     RewriteRule^/%1 [NC,L,R] 
</Directory> 

Nếu sử dụng .htaccess để viết lại đảm bảo rằng apache2.conf ít nhất có các tùy chọn này được bật.

<Directory /var/www/> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Require all granted 
     RewriteEngine On 
</Directory> 

Cuối cùng trên một số Apache cài đặt bạn có thể cũng cần phải thiết lập AllowOveride All trong một file conf trong/etc/apache2/sites-available hoặc/etc/apache2/sites-enabled.
Viết lại từ tập tin apache2.conf trái với .htaccess được đồn đại là nhanh hơn.

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