10/10/2018, 11:24

Nhờ các bác giúp về .htaccess

(Chú ý : do diễn đàn ko cho post link trực tiếp khi chưa đủ 10 post nên Em để dấu chấm (.) trong ngoặc []. Các bác thông cảm giúp)

Tình hình là Em có con site hiện tại đang chạy link thế này

tenmien[.]com/index[.]php

và Em có 1 cái form search, khi submit search thì link sẽ hiển thị như sau :

tenmien[.]com/index[.]php?search=keyword

bây giờ Em muốn re-write lại cái url như sau :

mỗi khi vào tenmien thì nó sẽ tự động chuyển về thành

tenmien[.]com/search/

và sau khi nhấn search thì url nó sẽ chuyển thành

tenmien[.]com/search/keyword/

-------------------------------------------------

Em đã thử viết đoạn code trên trong .htaccess như sau :

RewriteEngine On
RewriteRule ^search$ /search/$1 [R]
RewriteRule ^search/ /index[.]php
RewriteRule ^search/(.*)/$ /index[.]php?search=$1


nhưng không hoạt động.
Loay hoay mãi mà ko viết được. Bác nào rành về cái này giúp Em sửa cho đúng được ko ? viết thế nào cho chạy được & trong form html thì action phải để thế nào cho đúng ?

Chân thành cám ơn các bác !
sonnb viết 13:26 ngày 10/10/2018
Cái này hiện tại mình làm thì không check được, do form post sẽ là dạng ?search=keyword nên cùng lắm thì bạn chỉ có thể để dạng /search/?search=keyword với action của form là action="/search/".

Có 1 cách khác có thể giúp bạn chuyển sang dạng: /search/keyword/ đó là chuyển từ POST qua GET. Cách này sẽ khiến user bị redirect thêm 1 lần.
Khi POST thì sẽ nhận $_POST['search'] = keyword.
bạn sẽ check GET, nếu empty thì đẩy nó qua /search/keyword/ (rewrite bằng .htaccess).
bluewayvn viết 13:32 ngày 10/10/2018
RewriteEngine On
RewriteRule ^search$ index.php [NC,L]
RewriteRule ^search/$ index.php [NC,L]
RewriteRule ^search/(.*)$ index.php?search=$1 [NC,L]

Thử thế này xem có được không? Chỗ redirect thì nên dùng php hay html refresh hoặc javascript đều dc. Mình không dùng .htaccess cho redirect
MANHHA viết 13:27 ngày 10/10/2018
Được gửi bởi sonnb
Cái này hiện tại mình làm thì không check được, do form post sẽ là dạng ?search=keyword nên cùng lắm thì bạn chỉ có thể để dạng /search/?search=keyword với action của form là action="/search/".

Có 1 cách khác có thể giúp bạn chuyển sang dạng: /search/keyword/ đó là chuyển từ POST qua GET. Cách này sẽ khiến user bị redirect thêm 1 lần.
Khi POST thì sẽ nhận $_POST['search'] = keyword.
bạn sẽ check GET, nếu empty thì đẩy nó qua /search/keyword/ (rewrite bằng .htaccess).
Em không hiểu ý cái chuyển từ POST qua GET của bác lắm. Bác có thể viết 1,2 dòng ví dụ cho Em hiểu rõ hơn được ko ? form hiện tại Em cũng đang dùng GET chứ ko dùng POST
sonnb viết 13:25 ngày 10/10/2018
ví dụ nhé:
<form action="index.php" method="POST">
<input type="hidden" name="isSearch" value="1" />
<input type="text" name="search" value="" />
</form>

ở file index.php sẽ xử lý như sau:
if (isset($_POST['isSearch'] AND $_POST['isSearch'] == "1")
{
header("location: /search/".$_POST['search']."/");
}

Ở .htaccess:
RewriteRule ^search/(.*)$ index.php?act=search&keyword=$1 [NC,L]

Khi đó thì nó sẽ chuyển sang dạng $_GET và ở index.php sẽ lọc như sau:
if (isset($_GET['act']) AND $_GET['act'] == "search")
{
$keyword = $_GET['keyword'];
....
}

Cách này sẽ khiến user bị redirect 1 lần.
MANHHA viết 13:37 ngày 10/10/2018
Cám ơn bác rất nhiều ! Em làm thử theo cách trên của bác và h đã okie chỉ có điều chạy hơi chậm hơn 1 chút (
sonnb viết 13:30 ngày 10/10/2018
Tại vì phải xử lý và redirect thêm 1 lần mà. Bạn nên để đoạn:

if (isset($_POST['isSearch'] AND $_POST['isSearch'] == "1")
{
header("location: /search/".$_POST['search']."/");
}

Ở đầu trang trước khi xử lý các request khác để tốc độ được tốt nhất có thể.
Profit viết 13:35 ngày 10/10/2018
Nếu dùng $_GET Hạn chế là ko quản lý được user search vô tội vạ làm die host.
ckid137 viết 13:24 ngày 10/10/2018
Chật..nói vậy thì như con dao 2 lưỡi. Mình đang nghiên cứu nó đây. Thanks mọi người
Bài liên quan
0