Điểm:0

Chuyển hướng di động trong nginx với chuỗi truy vấn

lá cờ lc

Tôi đang cố chuyển hướng khách truy cập trên thiết bị di động đến các trang AMP bằng nginx. Về cơ bản tôi đã sử dụng tập lệnh @ https://gist.github.com/dangayle/2919206 với các sửa đổi được đề xuất, cộng với các yếu tố từ câu trả lời @ thêm đường dẫn hậu tố URL (cho AMP trên thiết bị di động) mà không gây ra vòng lặp chuyển hướng trong nginx_

Sự khác biệt chính ở đây là tôi không cố gắng chuyển hướng người dùng di động đến tên miền phụ dành cho thiết bị di động và thay vào đó chỉ cần thêm một chuỗi truy vấn (?amp=1"):

Đó là mã trong khối HTTP cho nginx.conf:

    mặc định 0;

    "~* (android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo |midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6) 0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino" 1;

    "~* ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)| al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s ) |avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi |ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do( c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa |ze)|fec|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit |hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p |s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno |ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi )|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo) |mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5 )|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti| wv)|oran|owg1|p800|p an(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt| se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks| rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c (\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar| b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18 )|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3| m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)| vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|của bạn|zeto|zte\-)" 1;
}

và đoạn mã còn lại ở vị trí /:

đặt $mobile_rewrite do_not_perform;

nếu ($mobile_agent = 1){
    đặt $mobile_rewrite thực hiện;
}

nếu ($mobile_agent = 1){
    đặt $mobile_rewrite thực hiện;
}

#kiểm tra nếu truy vấn arg = yes (example.com?mobile=yes), đặt biến
nếu ($arg_mobile = 'có') { 
    add_header Set-Cookie mobile=yes;
    đặt $mobile_rewrite thực hiện;
}

#kiểm tra nếu cookie di động=có, hãy đặt biến
nếu ($cookie_mobile = 'có') { 
    đặt $mobile_rewrite thực hiện;
}

#kiểm tra xem cookie di động có=không, ngắt
nếu ($cookie_mobile = 'không') { 
    đặt $mobile_rewrite do_not_perform;
}

#kiểm tra xem truy vấn arg = no (example.com?mobile=no), ngắt
nếu ($arg_mobile = 'không') { 
    add_header Set-Cookie mobile=no;
}

#if $mobile_rewrite = thực hiện, chuyển hướng
nếu ($mobile_rewrite = thực hiện) {
    viết lại ^.*(?<!/?amp=1)$ $scheme://www.cnx-software.es$request_uri?amp=1 break;
}

Tôi vẫn gặp rắc rối với các chuyển hướng bị mắc kẹt trong một vòng lặp. Ví dụ: https://www.cnx-software.es/2021/08/31/arm-china-ahora-es-totalmente-independiente-de-arm/?amp=1?amp=1&amp=1?amp=1&amp=1 ?amp=1&amp=1?amp=1&amp=1?amp=1&amp=1...

Vấn đề có lẽ là dòng viết lại, nhưng tôi đã có thể xác định chính xác vấn đề.

Điểm:1
lá cờ us

Bạn đang cố gắng thực hiện đối sánh phủ định trong regex để ngăn viết lại khi bộ khuếch đại đối số truy vấn là 1 trong URL yêu cầu.

Tốt hơn là thực hiện kiểm tra này với một lần nữa nếu chặn:

nếu ($arg_amp = 1) {
    đặt $mobile_rewrite do_not_perform;
}

Sau đó, viết lại của bạn có thể là:

nếu ($mobile_rewrite = thực hiện) {
    viết lại ^ $scheme://www.cnx-software.es$request_uri?amp=1 break;
}
lá cờ lc
Cảm ơn bạn. Nó hoạt động, nó đơn giản hơn nhiều so với những gì tôi đã cố gắng làm. Tôi đã đọc rằng chúng ta nên tránh sử dụng "nếu" trong các khối vị trí. Nhưng dù sao thì vì một lý do nào đó mà việc chuyển hướng chỉ gây ra lỗi 404 trên di động và sau khi di chuyển mã lên ngay dưới dòng server_name thì bây giờ là OK. Một lưu ý khác. nginx nói nên sử dụng return thay vì viết lại khi có thể trong https://www.nginx.com/blog/creating-nginx-rewrite-rules/ Vì vậy, sẽ tốt hơn nếu sử dụng một cái gì đó như ```return 301 $scheme://www.cnx-software.es$request_uri?amp=1;``` Hay nó không thực sự quan trọng?
lá cờ us
Tôi đã nghĩ đến việc sử dụng `return`, nhưng vì bạn đã sử dụng `break` với `rewrite`, nên nó chỉ thực hiện ghi lại nội bộ. Ngoài ra, tôi nghĩ chuyển hướng vĩnh viễn không tốt trong trường hợp này.
lá cờ lc
Tôi vừa nhận thấy điều này gây ra sự cố với các liên kết được chia sẻ trên Facebook hoặc các nguồn khác có thêm một hoặc nhiều chuỗi truy vấn. Vì vậy, tôi đã tạo ra một bản đồ `bản đồ $is_args $separator { mặc định "?"; "?" "&"; }` và thay đổi cách viết lại như sau: `viết lại ^ $scheme://www.cnx-software.es$request_uri${separator}amp=1 break;` Nó gần như hoạt động, nhưng vì một số lý do sau lần chuyển hướng đầu tiên: https://www.cnx-software.es/2021/09/23/un-primer-vistazo-a-la-placa-de-desarrollo-microchip -polarfire-soc-fpga-icicle/?fbclid=xxx&amp=1, nó diễn ra trong một vòng lặp với $arg_amp=1 không được phát hiện.
lá cờ lc
Thật thú vị... Nếu tôi nhấp vào liên kết có ?fbclid=xxx&amp=1 thì nó hoạt động, nhưng không hoạt động khi truy cập liên kết chỉ có ?fbclid=xxx. Có vẻ như chuyển hướng của tôi tạo ra một liên kết với "?fbclid=xxx&amp=1?fbclid=xxx" thay vào đó... Vì vậy, giá trị đối số amp là "1?fblcid=xxx" thay vì... Làm thế nào mà có thể?
lá cờ us
Điều này có thể xảy ra do hành vi mặc định của nginx là nối thêm các chuỗi truy vấn khi viết lại. Tôi sẽ tinh chỉnh câu trả lời của mình để giải quyết vấn đề này.

Đă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.