PDA

View Full Version : Redirect



proxyblue
16-09-2002, 07:37
Công dụng của redirect là gì? Ai biết chỉ dzới!!!

embe
16-09-2002, 09:05
bạn hỏi kỹ thêm 1 chút nhen, mình vẫn chưa hiểu á!

artnet
16-09-2002, 10:56
Công dụng của redirect là giúp nhảy trực tiếp từ trang này sang trang khác...

Một ví dụ đơn giản:

Trang dovui : 1+1= ??? rồi cho phép bạn điền câu trả lời.
Nếu đáp số bằng 2 -> redirect tới trang traloidung
Nếu đáp số khác 2 -> redirect tới trang traloisai


--=[artnet]=--

embe
16-09-2002, 22:57
Chòi, nếu như theo ý artnet trả lời thì nó chẳng khác nào 1 hàm if thông dụng mà thôi. Theo giả thuyết tui đặt ra redirect mà proxyblue đề cập là click vào 1 URL, nó tăng counter của website đó, sau đó redirect về 1 địa chỉ khác. Vậy theo ý này, redirect là dẫn hướng 1 cái gì đó (1 website, 1 webpage, 1 application) sang 1 trạng thái khác. Thế thôi.

Đúng không proxyblue?

genuine
16-09-2002, 23:07
ví dụ : trang ddth này nè ... lúc bấm nút login xong ... nhảy qua trang thông báo đợi và sau đó nhảy về trang index ...

proxyblue
16-09-2002, 23:52
Bài viết được gửi bởi embe
Chòi, nếu như theo ý artnet trả lời thì nó chẳng khác nào 1 hàm if thông dụng mà thôi. Theo giả thuyết tui đặt ra redirect mà proxyblue đề cập là click vào 1 URL, nó tăng counter của website đó, sau đó redirect về 1 địa chỉ khác. Vậy theo ý này, redirect là dẫn hướng 1 cái gì đó (1 website, 1 webpage, 1 application) sang 1 trạng thái khác. Thế thôi.

Đúng không proxyblue?
=>Tăng counter. Thanks!

xmb
17-09-2002, 16:56
redirect va` header khác nhau chỗ nào vậy mấy bác
Cái nào chuyển trang nhanh hơn ?

embe
18-09-2002, 00:04
Y chang, redirect nếu dùng:

1. JavaScript là dùng

<script>history.go(-1)</script>

hoặc là:

<scrript>history.go("<URL cần dẫn đến>")</script>

2. Nếu dùng tag meta trong head thì là:

<head>
<meta http-equiv="REFRESH" content="số giây delay; url="URL cần dẫn đến">
</head>

3. Còn dùng PHP:

<?php
header("Location: <URL cần dẫn đến>");
?>


Theo các cách thì có thể thấy rằng, dùng header thì không show code cho bà con coi, còn mấy cách kiếm, code sẽ bị show và... bà con sẽ học hỏi được.

vuminhphan
18-09-2002, 14:07
cũng xin nói thêm là nếu muốn dùng dạng delay (giống như DDTH này - mà tui thấy bi giờ ở đâu cũng...xài) thì:

1. dùng thẻ meta giống như embe đã nói
2. dùng javascript: history.go(), window.location, document.href... kết hợp với function setTimeout() hoặc setInterval().

Về Đâu
22-09-2002, 18:29
bài viết hay ghê

blackface
24-09-2002, 07:55
ASP thì dùng Response.Redirect("url")

vuminhphan
24-09-2002, 09:45
Bài viết được gửi bởi blackface
ASP thì dùng Response.Redirect("url")

method response.redirect vẫn còn hạn chế lắm, vì thế asp 3.0 có support thêm 2 method khác hay hơn nhiều:

server.execute("url") và
server.transfer("url")

Về Đâu
24-09-2002, 10:52
như vậy java scripts là phù hợp nhất cho ba cái vụ đại loại như login , post ... đại loại như vậy phài không các bác

White_Rose
24-09-2002, 15:36
Nhu*ng cu~ng kho^ng the^? kho^ng su du.ng duoc du'ng khong a.? Theo em thay thi hinh nhu la transfer va execute chi hoat dong neu nhu:
- Chua co dua lieu nao duoc dua ra (chang han dung response.write "...") hoac neu da co roi thi phai dung response.flush
- phai thiet lap bo dem response.buffer = true
- Toan bo thong tin gui len script (thong qua post hay get) deu duoc truyen cho script moi nhung ta lai khogn the truyen them. Chang han neu goi server.transfer "url.asp?id=1" thi kieu gi cung bi ba'o loi.

Xin lỗi mọi ngưòi nha, lúc mơi vào gõ luôn không thấy phần gõ tiếng Việt (tại dùng ở hàng) nên phải gõ không dấu. Sorry!

blackface
25-09-2002, 08:13
Xin phép cho em hỏi "Response.Redirect" nó bị hạn chế ở chỗ nào ạ. Kính

White_Rose
25-09-2002, 09:58
Hạn chế ở chỗ có thể có lỗi và tốn bandwidth. Khi gặp một lệnh .Redirect, đầu tiên server gửi về client (trình duyệt) một mã có số hiệu là *** (hình như là 303 hay 305 thì phải) cùng với URL. Client nhận được được tín hiệu này sẽ gửi yêu cầu tới trang mới đến server.
Ưu điểm:
- dễ dùng (dùng thế nào cũng được), có thể truyền theo gía trị bằng cách cùng scriptname.asp?var1=***&var2=***
Hạn chế:
- Tốn bandwidth (nếu server chưa gửi gì về client còn đỡ, nếu nó gửi gần hết dữ liệu rồi thì mất công toi
- Vì do server gửi yêu cầu về client rồi client lại yêu cầu lại server nên xác xuất bị lỗi cao hơn.
- Đi đường vòng -> mất time

hostshop
26-09-2002, 17:16
Híc, sao lạ vậy, bất kể dùng cái gì, 1 khi đã redirect là server đều phải chuyển về cho client mã 307, cái này định nghĩa theo HTTP 1.1 rùi, làm sao thay đổi được. Vậy thì làm sao nói là dùng response.redirect tốn bandwidth được. Với lại, dùng cách nào mà chẳng có thể redirect đến scriptname.asp?var1=***&var2=***. Hơn nữa nếu dùng header('Location: scriptname.php'); trong PHP thì phải đặt ob_start(); và ob_end_flush(); để tránh trường hợp gửi content trước khi sử dụng header vì nếu gửi content trước khi sử dụng header thì sẽ gây lỗi do header bao giờ cũng phải được gửi đầu tiên (cái này cũng được định nghĩa trong HTTP 1.1).

White_Rose
27-09-2002, 01:09
Trời, nhưng kia là transfer và execute chứ có phải redirect đâu. Nó chả gửi mã nào hết á. Dùng để thi hành script khác với cùng dữ liệu mà user gửi lên.

Bạn coi 2 cái này nhé.

http://www.chip81.com/vbasp/vbasp.asp?cat=3&sec=2&topic=12&id=15

http://www.chip81.com/vbasp/vbasp.asp?cat=3&sec=2&topic=12&id=14

hostshop
27-09-2002, 17:05
Thế transfer hay execute thì không phải là chuyển sang trang khác à??? Mà đã chuyển sang trang khác thì phải gửi mã 307, nếu không thì bạn thử nói xem làm sao client biết bao giờ server redirect cơ chứ? Còn việc thi hành script khác thì dùng response.redirect cũng có chết ai đâu, vẫn được muh.

White_Rose
28-09-2002, 00:15
Client đâu có biết là Server chuyển trang đâu. Chỉ có mình server biết thôi. Trên thanh Address vẫn là URL đến trang ban đầu mà bạn yêu cầu nhưng nội dung hiện ở dưới không phải là do một mình trang đó tạo ra.

Một ví dụ đơn giản nhất chứng minh sự tiện dụng của Transfer:
- Toàn bộ Website mình để trong thư mục A -> để xem mình phải gõ mydomain.com/A . Nhưng nếu muốn gõ mydomain.com mà vào đó luôn mà dùng Ridirect thì rõ ràng client phải yêu cầu hai lần đúng không? Nhưng nếu dùng transfer thì khi gõ vào mydomain.com, file mặc định được thi hành. Nó sẽ transfer bằng lệnh:
Server.transfer "a/default.asp"
như vậy file default.asp sẽ thi hành và trả về kết quả cho dù client chưa hề yêu cầu nó.

Với Execute thì khác, chẳng hạn khi submit form để add dữ liệu, mình muốn add xong phải quay về form đó để add tiếp. Như vậy nếu add xong rồi redirect thì cũng gọi 2 lần. Mình có thể làm như này:
Nếu thấy có dữ liệu submit thì execute một script để add (vì toàn bộ dữ liệu vẫn được chuyển qua script đó). Khi nó thực hiện xong thì quyền thi hành lại quay về script cũ --> ở action mình gọi luôn cái script chứa form submit đó -> client vẫn chỉ request 1 lần thôi.

hostshop
28-09-2002, 01:43
Hơ, bạn nói hay nhỉ, nếu mà client không biết server redirect thì browser vẫn dậm chân tại chỗ không chuyển sang trang mới. Chỉ có server chuyển sang trang mới trên server thui, mà có chuyển sang trang mới trên server mà browser không chịu chuyển thì làm sao hiển thị thông tin được.
Khi bạn duyệt web thì trình duyệt chuyển yêu cầu thông tin đến server, sau đó server trả lại 1 mã xác nhận server đã trả lời và server có chấp nhận yêu cầu không, nếu chỉ có server chuyển trang thì làm sao mà server nhận được thông tin gì được. Bạn thử đọc lại RFC2616 mà xem (hình như thế, không nhớ rõ số lắm vì lâu lắm rùi tui không đọc lại).

Ai bảo bạn là dùng response.redirect thì client phải yêu cầu 2 lần??? Trong trang ASP của bạn, bạn có dòng response.redirect("www.mydomain.com/A") thì nó sẽ hoạt động giống hệt server.transfer("www.mydomain.com/A").
server.execute("www.mydomain.com/A") thì khác vì sau khi redirect và thực hiện xong trang www.mydomain.com/A thì nó sẽ nhường quyền điều khiển lại cho trang gọi nó. Tuy vậy nó vẫn gửi về mã 307 Temporary Redirect cho client.

White_Rose
28-09-2002, 02:37
This new method is an alternative to using the Response.Redirect method to transfer to another page, and allows the transfer of the ASP built-in and Error objects to a second page. In addition, the transfer takes place on the server instead of forcing the browser to redirect to a new page
Đây là những gì mà chính Microsoft thông báo. Nếu bạn vẫn không tin thì mình đành chịu.
Xin nhắc lại, việc chuyển trang này là do server thực hiện, kết quả gửi về là do script được chuyển tới và nó chính xác như là bạn gọi chính script đó vậy. Tuy nhiên, client không biết gì hết và vẫn cho rằng đó là kết quả của script mà nó yêu cầu.

hostshop
28-09-2002, 08:10
Hi'c, giờ mới hiểu ý bác. Cứ tưởng bác bảo client yêu cầu rùi server thực hiện mà không trả lại gì. Đúng là server.transfer thì server chuyển trang nhưng mà xong rùi thì vẫn phải gửi thông tin trả lại cho client chứ. Mà nếu như vậy thì nếu có tốn bandwidth cùng lắm cũng chỉ là dòng status: *** thui chứ có cái gì nữa đâu, 11 bytes tổng cộng, web em có lớn như của Yahoo với 1.000.000 lượt người truy cập 1 tháng thì em cũng chỉ mất có 11.000.000 bytes tương đương với 11 MB. Hi'c, chẳng hiểu bác kiệt sỉ đến mức nào mà tiếc đến từng MB 1 như thía.

EM vẫn chưa hiểu câu này của bác khi nói về response.redirect:

Vì do server gửi yêu cầu về client rồi client lại yêu cầu lại server nên xác xuất bị lỗi cao hơn..
Phải là client yêu cầu trước rùi server trả lời chứ, với lại dùng server.transfer hay server.execute thì chỉ có client yêu cầu mà server không trả lời hoặc là server tự trả lời mà không cần client yêu cầu sao??? Xin bác giải thích rõ cho em hỉu.

White_Rose
28-09-2002, 12:39
Bài viết được gửi bởi hostshop
Hi'c, giờ mới hiểu ý bác. Cứ tưởng bác bảo client yêu cầu rùi server thực hiện mà không trả lại gì. Đúng là server.transfer thì server chuyển trang nhưng mà xong rùi thì vẫn phải gửi thông tin trả lại cho client chứ. Mà nếu như vậy thì nếu có tốn bandwidth cùng lắm cũng chỉ là dòng status: *** thui chứ có cái gì nữa đâu, 11 bytes tổng cộng, web em có lớn như của Yahoo với 1.000.000 lượt người truy cập 1 tháng thì em cũng chỉ mất có 11.000.000 bytes tương đương với 11 MB. Hi'c, chẳng hiểu bác kiệt sỉ đến mức nào mà tiếc đến từng MB 1 như thía.

EM vẫn chưa hiểu câu này của bác khi nói về response.redirect:
.
Phải là client yêu cầu trước rùi server trả lời chứ, với lại dùng server.transfer hay server.execute thì chỉ có client yêu cầu mà server không trả lời hoặc là server tự trả lời mà không cần client yêu cầu sao??? Xin bác giải thích rõ cho em hỉu.

Bạn có đảm bảo mạng (nhất là mạng ở VN) dữ liệu luôn luôn được di chuyển với độ an toàn là 100% không? Vì thế càng ít những yêu cầu càng tốt. Mà nếu mạng nghẽn thì cũng tiện vì không phải yêu cầu 2 lần.

Với Redirect thì đầu tiên Client yêu cầu trang 1. Khi Server xử lý đến yêu cầu redirect này, nó sẽ gửi mã trạng thái 307 cùng với địa chỉ tới script thứ 2 (không phải là 11 byte như bạn nói mà có thể nhiểu hơn nếu như tên script dài, có các variable kèm theo...). Khi Client nhận được mã trạng thái này, nó sẽ gửi một yêu cầu tới server mà đích đến là cái địa chỉ mà trước đó server gửi cho nó. Đấy là theo mình biết.

Còn transfer và execute thì bản thân client không hề yêu cầu script thứ 2. Tuy nhiên, trong source code của script 1 nó cần phải thực hiện script 2. Vì thế nó tự động thực thi cái script đó (vì đó là yêu cầu của script 1 - yêu cầu của programmer) rồi gửi trả toàn bộ kết quả về client. Client chỉ biết rằng nó yêu cầu script 1 và nó nhận đuợc kết quả chứ nó không hề biết ràng script thứ 2 (thậm chí có thể là thứ n) đã được thực thi trên server. Số lần yêu cầu của Client đương nhiên vẫn là 1.

:)

vuminhphan
28-09-2002, 12:43
hì, nói hay lắm, đọc các bài viết của các bạn mình hiểu thấu hơn được vấn đề đấy.

thân,

hostshop
28-09-2002, 13:07
Khi client gửi yêu cầu đến server thì server sẽ gửi trả về đề mục, mã trạng thái và nội dung được yêu cầu luôn vì vậy client không phải yêu cầu tiếp nữa đâu bác Chip81 a`. Cái mà bác bảo client yêu cầu, server diễn dịch đến response.redirect, gửi address về cho client để client tiếp tục truy cập thì là mã 303 chứ không phải 307.

White_Rose
28-09-2002, 13:25
:P Thiệt tình mình không biết về mấy protocol nên không biết chính xác nó gửi mã thế nào. Có điều nếu không dùng hai cái trên (đang nói trong ASP) thì kiểu gì Client cũng yêu cầu 2 lần.
- Dùng <meta...>: Đầu tiên Client yêu cầu trang 1, thấy cái meta thì sau 1 thời gian yêu cầu trang 2
- dùng JS, VBS: yêu cầu trang 1, khi xử lý script thì yêu cầu trang 2
- dùng Response.Redirect : Ví dụ như trong file test.asp có

<%Response.Buffer = true
'...something
Response.Redirect "test1.asp"
'...something
%>
thì tất nhiền là client nó yêu cầu cả 2 scrip là test.asp và test1.asp rồi.

Hi, hay thiệt, đến giờ biết thêm về mấy status code mà browser giao tiếp với server. Tranh luận với bác hay thiệt:)