Xóa phần mở rộng .php bằng .htaccess


101

Có, tôi đã đọc hướng dẫn sử dụng Apache và tìm kiếm ở đây. Vì một số lý do tôi không thể làm cho nó hoạt động. Điều gần nhất mà tôi đã đến là nó xóa phần mở rộng, nhưng nó trỏ trở lại thư mục gốc. Tôi muốn điều này chỉ hoạt động trong thư mục chứa .htaccesstệp.

Tôi cần làm ba việc với .htaccesstệp.

  1. Tôi cần nó để xóa .php

    a. Tôi có một số trang sử dụng tab và URL trông giống như tab page.php # - điều này có khả thi không?

    b. Tôi có một trang sử dụng ID phiên được thêm vào URL để đảm bảo rằng bạn đến từ đúng nơi www.domain.com/download-software.php?abcdefg,.

Điều này có khả thi không? Ngoài ra khi thực hiện việc này, tôi có cần xóa ".php" khỏi các liên kết trong tệp bao gồm điều hướng tiêu đề của mình không? NênIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Tôi muốn nó buộc "www" trước mỗi URL, vì vậy nó không phải domain.com, nhưng www.domain.com/page.
  2. Tôi muốn xóa tất cả các dấu gạch chéo ở cuối trang.

Tôi sẽ tiếp tục tìm kiếm, cố gắng, v.v. Việc ở trong một thư mục con có gây ra bất kỳ sự cố nào không?



Tôi chỉ tò mò, đây là lợi ích gì? Điều này khiến người dùng của bạn không biết họ đang truy cập vào tệp nào trên máy chủ của bạn?
Kolob Canyon

gấp hai lần. vì vậy họ không biết những gì các loại tập tin chúng tôi đang phục vụ, và nó chỉ có vẻ sạch hơn IMO
bẩn Bird Thiết kế

Một câu hỏi liên quan khác: stackoverflow.com/questions/6534904/… .
Edward

Câu trả lời:


121

Câu trả lời của Gumbo trong câu hỏi Stack Overflow Làm thế nào để ẩn phần mở rộng .html bằng Apache mod_rewrite sẽ hoạt động tốt.

Re 1) Thay đổi .html thành .php

Re a.) Đúng vậy, có thể, chỉ cần thêm #tabvào URL.

Re b.) Có thể sử dụng QSA(Nối chuỗi truy vấn), xem bên dưới.

Điều này cũng sẽ hoạt động trong một đường dẫn thư mục con:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

Thx cho người trợ giúp của bạn, vì bất kỳ lý do gì, tôi cá là do url nối phiên được mã hóa cứng trong tệp PHP (câu chuyện dài) Tôi có thể truy cập nó mà không cần những điều trên. Tôi thực sự đánh giá cao sự giúp đỡ của bạn, công cụ .htaccess này rất khó đối với tôi.
Dirty Bird Design vào

8
@Pekka 웃 loại bỏ khoảng cách giữa các cờ [L,khoảng trắng QSA], nếu không sẽ gây ra Lỗi máy chủ nội bộ 500 .
Rahil Wazir

điều này sẽ /index/bla/blagiống nhưindex.php
xác nhận

đối với một số lý do khối này CSS của tôi để tải: /
TheCrazyProfessor

! có nghĩa là không. Quy tắc cho biết chỉ viết lại để thêm .php nếu nó chưa kết thúc trong .php
user339568

72

Apache mod_rewrite

Những gì bạn đang tìm kiếm là mod_rewrite ,

Mô tả: Cung cấp công cụ viết lại dựa trên quy tắc để viết lại các URL được yêu cầu một cách nhanh chóng.

Nói chung, mod_rewritehoạt động bằng cách đối sánh tài liệu được yêu cầu với các biểu thức chính quy được chỉ định, sau đó thực hiện ghi lại URL bên trong (trong quy trình apache) hoặc bên ngoài (trong trình duyệt máy khách). Các bản viết lại này có thể đơn giản như dịch nội bộ example.com/foo thành một yêu cầu cho example.com/foo/bar.

Tài liệu Apache bao gồm một mod_rewritehướng dẫn và tôi nghĩ rằng một số điều bạn muốn làm đều có trong đó. Hướng dẫn mod_rewrite chi tiết .

Buộc wwwtên miền phụ

Tôi muốn nó buộc "www" trước mỗi url, vì vậy nó không phải là domain.com mà là www.domain.com/page

Hướng dẫn viết lại bao gồm hướng dẫn cho việc này trong ví dụ Tên máy chủ hợp quy .

Xóa dấu gạch chéo (Phần 1)

Tôi muốn xóa tất cả các dấu gạch chéo ở cuối trang

Tôi không chắc tại sao bạn lại muốn làm điều này vì hướng dẫn viết lại bao gồm một ví dụ hoàn toàn ngược lại , tức là luôn bao gồm dấu gạch chéo ở cuối. Tài liệu gợi ý rằng việc loại bỏ dấu gạch chéo có khả năng gây ra sự cố lớn:

Vấn đề về dấu gạch chéo

Sự miêu tả:

Mọi quản trị viên web có thể hát một bài hát về vấn đề dấu gạch chéo trên các URL tham chiếu đến thư mục. Nếu chúng bị thiếu, máy chủ kết xuất lỗi, vì nếu bạn nói /~quux/foothay vì /~quux/foo/ thì máy chủ sẽ tìm kiếm tệp có tên foo. Và bởi vì tệp này là một thư mục mà nó phàn nàn. Trên thực tế, nó cố gắng tự sửa lỗi trong hầu hết các trường hợp, nhưng đôi khi cơ chế này cần được bạn mô phỏng. Ví dụ: sau khi bạn đã thực hiện nhiều thao tác ghi lại URL phức tạp thành tập lệnh CGI, v.v.

Có lẽ bạn có thể mở rộng lý do tại sao bạn luôn muốn xóa dấu gạch chéo?

Xóa .phpphần mở rộng

Tôi cần nó để xóa .php

Điều gần nhất để làm điều này mà tôi có thể nghĩ đến là viết lại nội bộ mọi tài liệu yêu cầu bằng phần mở rộng .php, tức là example.com/somepage thay vào đó được xử lý dưới dạng yêu cầu cho example.com/somepage.php. Lưu ý rằng tiếp tục theo cách này sẽ yêu cầu mỗi trang thực sự tồn tại dưới dạng somepage.php trên hệ thống tệp.

Với sự kết hợp phù hợp của các cụm từ thông dụng, điều này sẽ có thể thực hiện được ở một mức độ nào đó. Tuy nhiên, tôi có thể thấy trước một số vấn đề có thể xảy ra với các trang chỉ mục không được yêu cầu chính xác và không khớp các thư mục một cách chính xác.

Ví dụ: điều này sẽ viết lại chính xác example.com/test dưới dạng yêu cầu cho example.com/test.php:

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

Nhưng sẽ làm cho example.com không tải được vì không có example.com/.php

Tôi đoán rằng nếu bạn xóa tất cả các dấu gạch chéo, thì việc chọn một yêu cầu cho chỉ mục thư mục từ một yêu cầu cho một tên tệp trong thư mục mẹ sẽ trở nên gần như không thể. Làm cách nào để xác định yêu cầu cho thư mục 'foobar':

example.com/foobar

từ một yêu cầu cho một tệp có tên foobar (thực chất là foobar.php)

example.com/foobar

Có thể có nếu bạn sử dụng RewriteBasechỉ thị. Nhưng nếu bạn làm điều đó thì vấn đề này trở nên phức tạp hơn vì bạn sẽ yêu cầu RewriteCondcác lệnh để thực hiện kiểm tra mức hệ thống tệp nếu yêu cầu ánh xạ tới một thư mục hoặc một tệp.

Điều đó nói rằng, nếu bạn loại bỏ yêu cầu xóa tất cả các dấu gạch chéo và thay vào đó, buộc thêm các dấu gạch chéo vào, thì vấn đề "không có phần mở rộng .php" sẽ hợp lý hơn một chút.

# Turn on the rewrite engine
RewriteEngine  on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]

Điều này vẫn chưa hoàn hảo - mọi yêu cầu cho tệp vẫn có .php được thêm vào yêu cầu trong nội bộ. Yêu cầu 'hi.txt' sẽ đưa thông tin này vào nhật ký lỗi của bạn:

[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat

Nhưng có một tùy chọn khác, đặt DefaultTypevà các lệnh DirectoryIndexnhư thế này:

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

Cập nhật 2013-11-14 - Đã sửa đoạn mã trên để kết hợp quan sát của nicorellius

Bây giờ các yêu cầu cho hi.txt (và bất kỳ thứ gì khác) đã thành công, các yêu cầu tới example.com/test sẽ trả về phiên bản đã xử lý của test.php và các tệp index.php sẽ hoạt động trở lại.

Tôi phải cung cấp tín dụng cho giải pháp này vì tôi đã tìm thấy nó Michael J. Radwins Blog bằng cách tìm kiếm trên Google cho php không có apache mở rộng .

Xóa dấu gạch chéo ở cuối

Một số tìm kiếm apache remove trailing slashesđã đưa tôi đến một số trang Tối ưu hóa Công cụ Tìm kiếm. Rõ ràng một số Hệ thống quản lý nội dung (trong trường hợp này là Drupal) sẽ cung cấp nội dung có và không có dấu gạch chéo trong URls, điều này trong thế giới SEO sẽ khiến trang web của bạn bị phạt nội dung trùng lặp. Nguồn

Giải pháp có vẻ khá đơn giản, bằng cách sử dụng mod_rewritechúng tôi viết lại với điều kiện tài nguyên được yêu cầu kết thúc bằng a /và viết lại URL bằng cách gửi lại 301 Permanent Redirecttiêu đề HTTP.

Đây là ví dụ của anh ấy, giả sử miền của bạn là blamcast.net và cho phép yêu cầu có tiền tố tùy chọn www..

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

Bây giờ chúng ta đang đến một nơi nào đó. Hãy tập hợp tất cả lại với nhau và xem nó trông như thế nào.

Bắt buộc www., không .phpvà không có dấu gạch chéo

Điều này giả sử miền là foobar.com và nó đang chạy trên cổng tiêu chuẩn 80.

# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html

# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST}   !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST}   !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*)         http://www.foobar.com/$1 [L,R,NE]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

Cờ 'R' được mô tả trong phần RewriteRulechỉ thị. Đoạn trích:

redirect|R [=code](buộc chuyển hướng) Thay thế tiền tố bằng http://thishost[:thisport]/(làm cho URL mới trở thành URI) để buộc chuyển hướng bên ngoài. Nếu không có mã nào được cung cấp, phản hồi HTTP 302 ( MOVED TEMPORARILY ) sẽ được trả về.

Ghi chú cuối cùng

Tôi không thể làm cho việc loại bỏ dấu gạch chéo hoạt động thành công. Chuyển hướng đã kết thúc với tôi vòng lặp chuyển hướng vô hạn. Sau khi đọc kỹ hơn giải pháp ban đầu, tôi có ấn tượng rằng ví dụ trên phù hợp với họ vì cách cài đặt Drupal của họ được cấu hình. Anh ấy đề cập cụ thể:

Trên một trang web Drupal bình thường, với các URL sạch được bật, hai địa chỉ này về cơ bản có thể hoán đổi cho nhau

Liên quan đến các URL kết thúc bằng và không có dấu gạch chéo. Hơn nữa,

Drupal sử dụng một tệp được gọi .htaccessđể cho máy chủ web của bạn biết cách xử lý URL. Đây là cùng một tệp cho phép tạo URL sạch của Drupal. Bằng cách thêm một lệnh chuyển hướng đơn giản vào đầu .htaccesstệp, bạn có thể buộc máy chủ tự động xóa bất kỳ dấu gạch chéo nào.


wow cảm ơn vì tất cả điều đó. Trên thực tế, tôi đã có thể làm cho nó hoạt động, hóa ra có một số thứ kỳ lạ trên máy chủ của tôi mà tôi phải thay đổi. Dù sao, bây giờ hãy chuyển sang vấn đề tiếp theo, xóa .php khỏi tất cả các trang ngoại trừ một trang. thx người đàn ông
bẩn Bird Thiết kế

Tôi thích nhìn thấy những câu trả lời được suy nghĩ kỹ càng, có tổ chức. Làm tốt lắm ... Một điều tôi nhận thấy: ý bạn là DirectoryIndex index index.html? hoặc DirectoryIndex index.php index.html?
nicorellius

@nicorellius tin rằng bạn đúng. Tôi đã cập nhật câu trả lời ban đầu của tôi với sự quan sát của bạn.
Tim Bielawa

Tôi phải nói rằng điều này không phải lúc nào cũng hiệu quả. Hãy thử câu trả lời bên dưới (của người dùng 1079877)
DonJoe

Bạn là MVP thực sự.
ZainZaheer06

45

Ngoài các câu trả lời khác ở trên,

Bạn cũng có thể thử cách này để xóa hoàn toàn phần mở rộng .php khỏi tệp của mình và tránh vòng lặp vô hạn :

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]

Mã này sẽ hoạt động trong Root / .htaccess, Hãy đảm bảo thay đổi RewriteBase nếu bạn muốn đặt mã này vào tệp htaccess trong thư mục con.

Biên tập :

Trên apache 2.4 trở lên, bạn cũng có thể sử dụng cờ END để ngăn lỗi vòng lặp vô hạn. Ví dụ sau hoạt động giống như ở trên trên apache 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

10
Xin chào, Cảm ơn vì điều này. Tôi đã thử nhiều biện pháp nhằm cắt .php nhưng chỉ này làm việc một cách chính xác :)
beamkiller

4
Cảm ơn! Chỉnh sửa này là nơi at, apache 2.4, apache 2.5 của nó kết thúc trong vòng lặp vô hạn (và sẽ là 500) [END] siêu quan trọng
Jake Bolam

23

Mã sau hoạt động tốt đối với tôi:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

Điều này hoạt động ngoại trừ example.com biến thành một chỉ mục của tất cả các tệp và thư mục. (Apache 2.4)
earth2jason


10

Sau khi thay đổi các tham số AllowOverridetừ Noneđể All/etc/apache2/apache2.conf(Debian 8), sau này , các tập tin .htaccess chỉ phải chứa:

Options +MultiViews
AddHandler php5-script php
AddType text/html php

Và nó là đủ để ẩn phần mở rộng .php khỏi các tệp


Ước gì cái này cao hơn. Tại sao phải bận tâm với phần đầu của việc viết lại URL khi MultiViewsđiều này xảy ra
Phil

Điều đó thật tuyệt. Bất kỳ nhược điểm?
cải cách

@reformed Cảm ơn. Tôi phải liên kết thay đổi từ <a href="somepage.php">liên kết </a>để <a href="somepage">liên kết </a>trong mã nguồn
Rodney Salcedo

8

Hãy thử điều này
Đoạn mã sau chắc chắn sẽ hoạt động

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

5

Không chắc tại sao các câu trả lời khác không hoạt động với tôi nhưng mã này tôi tìm thấy đã làm được:

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

Đó là tất cả những gì có trong htaccess của tôi và example.com/page hiển thị example.com/page.php


4

Để xóa phần mở rộng .php khỏi một tệp PHP, ví dụ: yourite.com/about.php thành yoursite.com/about Thực hiện theo bước sau. Mở tệp .htaccess (tạo tệp mới nếu không tồn tại) từ thư mục gốc của trang web của bạn và thêm mã sau.

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

Để xóa phần mở rộng .html khỏi tệp html, ví dụ: yoursite.com/about.html thành yoursite.com/about Thực hiện theo bước sau.

Mở tệp .htaccess (tạo tệp mới nếu không tồn tại) từ thư mục gốc của trang web của bạn và thêm mã sau.

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

Tham khảo: Cách xóa phần mở rộng php khỏi URL


1
Câu trả lời duy nhất mà tôi cần. Cảm ơn! :)
MatrixCow08

2

Nếu bạn đang viết mã bằng PHP và muốn xóa .php để bạn có thể có một URL như:

http://yourdomain.com/blah -> trỏ đến /blah.php

Đây là tất cả những gì bạn cần:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

2

Tôi tìm thấy 100% ý tưởng làm việc cho tôi:

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Sử dụng mã này trong tệp .htaccess gốc của trang web của bạn như:

ngoại tuyến - wamp \ www \ YourWebDir

trực tuyến - public_html /

Nếu nó không hoạt động chính xác, hãy thay đổi cài đặt của Máy chủ Wamp của bạn: 1) Nhấp chuột trái vào biểu tượng WAMP 2) Apache 3) Mô-đun Apache 4) Nhấp chuột trái vào rewrite_module


Bạn không thể có hai chữ RewriteRules với thẻ Lbên cạnh nhau. [L]cho biết mod_rewriterằng đó là quy tắc cuối cùng cho quy tắc được chỉ định RewriteCond.
MD XF

2

Đây là mã mà tôi đã sử dụng để ẩn .phptiện ích mở rộng khỏi tên tệp:

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

Lưu ý: R=301dành cho chuyển hướng vĩnh viễn và được khuyến khích sử dụng cho mục đích SEO. Tuy nhiên, nếu ai đó chỉ muốn chuyển hướng tạm thời, hãy thay thế nó bằng chỉR


2

Tôi đã kết thúc với mã làm việc sau:

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

1

Nếu url của bạn trong PHP như http://yourdomain.com/demo.php hơn là http://yourdomain.com/demo

Đây là tất cả những gì bạn cần:

tạo tệp .htaccess

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

Nó hoạt động cho http://example.com/myfile nhưng nó không hoạt động với http://example.com/myfolder/(tệp chỉ mục). Bạn có thể giúp tôi làm cho nó hoạt động cho tệp chỉ mục không?
Wesley Gonçalves

Tôi nghĩ bạn nên thử ở trên URL câu trả lời @starkeen: stackoverflow.com/a/30566026/3786343
Kamlesh

1

Thử

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
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.