Điểm:1

viết lại và buộc chuyển hướng khi viết lại url gốc trong nginx

lá cờ in

Tôi có trường hợp này khi tìm kiếm html <form> buộc nó phải đi đến /search/index.php?q=term và muốn sử dụng một cái gì đó như /tìm kiếm/thuật ngữ thay thế.

Đây là cách cấu hình trông giống như ngay bây giờ:

vị trí /tìm kiếm/ {
    viết lại ^/search/(.+) /search/index.php?q=$1;
}

Truy cập trực tiếp vào vị trí này hoạt động, nhưng tại thời điểm điền vào biểu mẫu và tìm kiếm nó sẽ sử dụng "nguồn gốc" thay vì viết lại.

Tôi đã thử sử dụng chuyển hướng "ngược", nhưng điều đó đã làm hỏng dịch vụ nginx:

vị trí /tìm kiếm/ {
    viết lại ^/search/(.+) /search/index.php?q=$1;
    chuyển hướng ^/search/index.php?q=(.+) /search/$1;
}

Tôi cũng đã thử viết lại với dài hạn cờ, không làm gì cả

vị trí /tìm kiếm/ {
    viết lại ^/search/(.+) /search/index.php?q=$1;
    viết lại ^/search/index.php?q=(.+) /search/$1 vĩnh viễn;
}

Tôi biết có thể đạt được điều tương tự trong PHP với nội dung như thế này:

// Trên cùng của /search/index.php
if (str_starts_with($_SERVER['REQUEST_URI'], '/search/index.php')){
    $protocol = ($_SERVER['HTTP_X_FORWARDED_PROTO'] == "https") ? "https" : "http";
    $server = $_SERVER['HTTP_HOST'];
    truy vấn $ = mảng();
    parse_str($_SERVER['QUERY_STRING'], $queries);
    $search = $queries['q'] ?? "";
    tiêu đề ("Vị trí: $protocol://$server/search/$search");
}

Nhưng hãy nghĩ rằng sẽ tốt hơn nếu nginx có thể xử lý việc này (nếu có thể).

Có ai biết cách viết lại và chuyển hướng truy cập từ nguồn gốc không?

Richard Smith avatar
lá cờ jp
Không biết lệnh `redirect` là gì. Nhưng bạn có thể hiển thị mục nhật ký truy cập cho yêu cầu không thành công không?
Typewar avatar
lá cờ in
@RichardSmith Ok tôi hiểu rồi, tôi đã sai khi bắt đầu.Tôi lấy nó từ đây https://ubiq.co/tech-blog/rewrite-vs-redirect-nginx/. Nhật ký hệ thống Nginx thực sự nói rằng đó là một chỉ thị không xác định
Richard Smith avatar
lá cờ jp
Bạn có ý nghĩa gì bởi "nguồn gốc"? Có phải bạn đang nói rằng biểu mẫu gửi yêu cầu tới `/search/index.php?...` và bạn muốn thanh địa chỉ trình duyệt được thay đổi thành `/search/...`?
Typewar avatar
lá cờ in
Có, hoặc cụ thể hơn: `/search/index.php?q=[term]` và chuyển hướng đến `/search/[term]`
Điểm:1
lá cờ jp

Cấu hình hiện có giống như:

vị trí /tìm kiếm/ {
    viết lại ^/search/(.+) /search/index.php?q=$1;
}
vị trí ~ \.php$ {
    ...
}

URI /search/index.php được sử dụng nội bộ, vì vậy cố gắng sử dụng viết lại ^/search/index.php?q=(.+) /search/$1 vĩnh viễn; sẽ tạo ra một vòng lặp chuyển hướng.

Để xác định URI là một yêu cầu bên ngoài, bạn cần nhìn vào $request_uri Biến đổi. Và để làm được điều đó, bạn sẽ cần sử dụng khét tiếng nếu bản tường trình. Ví dụ:

if ($request_uri ~ ^/search/index\.php\?q=(.+)) {
    trả về 301 /search/$1;
}
vị trí /tìm kiếm/ {
    viết lại ^/search/(.+) /search/index.php?q=$1;
}
vị trí ~ \.php$ {
    ...
}
Typewar avatar
lá cờ in
Tôi hiểu rồi. Tôi đã thử đặt câu lệnh if bên trong phạm vi của `/search/`, nhưng không được. Ngoài phạm vi không hoạt động. Cảm ơn bạn rất nhiều!
Richard Smith avatar
lá cờ jp
Thật vậy, URI `/search/index.php` được xử lý bởi khối `location ~ \.php$`, vì nó kết thúc bằng `.php`.
Typewar avatar
lá cờ in
À! điều đó có ý nghĩa, cảm ơn bạn đã làm rõ
lá cờ us
Người ta cũng có thể sử dụng `if ($arg_q ~ (.+))` làm điều kiện `if`. Nó chỉ khớp khi đối số truy vấn `q` không trống. Không cần sử dụng `$request_uri`.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.