Last active
September 29, 2024 22:09
-
-
Save dangayle/2919206 to your computer and use it in GitHub Desktop.
NGINX Mobile redirect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Place this map directive inside the http block | |
http { | |
# Updated map directive with the latest regex | |
map $http_user_agent $mobile_agent { | |
default 0; | |
"~*android.+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|iphone|ipod|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|phone)|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)|fetc|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(di|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|pan(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\\-|your|zeto|zte\\-)" 1; | |
} | |
# Your server block | |
server { | |
listen 80; | |
server_name example.com; | |
# Location block where the if statements reside | |
location / { | |
# Initialize the variable | |
set $mobile_rewrite do_not_perform; | |
# Corrected if statement with proper spacing | |
if ($mobile_agent = 1) { | |
set $mobile_rewrite perform; | |
} | |
# Check if query parameter 'mobile' is 'yes' | |
if ($arg_mobile = 'yes') { | |
add_header Set-Cookie mobile=yes; | |
set $mobile_rewrite perform; | |
} | |
# Check if the 'mobile' cookie is 'yes' | |
if ($cookie_mobile = 'yes') { | |
set $mobile_rewrite perform; | |
} | |
# Check if the 'mobile' cookie is 'no' | |
if ($cookie_mobile = 'no') { | |
set $mobile_rewrite do_not_perform; | |
} | |
# Check if query parameter 'mobile' is 'no' | |
if ($arg_mobile = 'no') { | |
add_header Set-Cookie mobile=no; | |
set $mobile_rewrite do_not_perform; | |
} | |
# Perform the redirect if conditions are met | |
if ($mobile_rewrite = perform) { | |
return 301 $scheme://mobile.example.com$request_uri; | |
} | |
# Your other configurations go here | |
} | |
} | |
} |
I add something at line 39, but map section still not test ( i add that at location section so i can't use map )
https://gist.github.com/dd-han/11d39170d968f34b9de0fe4ccf7ca1e6
I think ~* must be inside string
In case someone finds this in the future:
- the map directive needs to go into the http block
- make sure to quote the whole string, including ~* (see comment above)
- the first if statement is missing a space between the if and the parentheses (
if(
instead ofif (
) - everything under the map directive, i.e. the if statements, need to go into a location block (likely
location / {....}
) - the regex neeeds to be updated from http://detectmobilebrowsers.com/
I had no idea this many people had starred this gist. I've made the suggested changes. Thanks @herrbuerger.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thx 👍