NGINX: 検索ボットのみを特定のファイルにリダイレクトする

NGINX: 検索ボットのみを特定のファイルにリダイレクトする

以前の .htaccess (Apache で使用) を nginx に移植してみます。

<IfModule rewrite_module>   
        RewriteEngine on
        RewriteCond "%{HTTP_USER_AGENT}" "(Googlebot|bingbot|slackbot|vkShare|W3C_Validator)" [NC]
        RewriteRule .* bot.php [L]
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule .* index.html [L]
    </IfModule>

以下は私が現在試していることです:

SearchEngine のリストとしてマップを生成しました:

map $http_user_agent $search_engines {
default 0;
"~bingbot.*" 1;
"~BingPreview.*" 1;
"~Googlebot.*" 1;
}
if ($search_engines = 1){
   rewrite ^/(.*) bot.php?$1 break;
} 

しかし、これにより無限ループが発生します。

完全なサーバーブロックは次のとおりです。

server {
    server_name mypage.de www.mypage.de;
    listen 1.1.1.1;
    root /home/mypage/public_html;
    index index.html index.htm index.php;
    access_log /var/log/virtualmin/mypage.de_access_log;
    error_log /var/log/virtualmin/mypage.de_error_log;
        
    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param SERVER_SOFTWARE nginx;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_param SCRIPT_FILENAME /home/mypage/public_html$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param REQUEST_URI $request_uri;
    fastcgi_param DOCUMENT_URI $document_uri;
    fastcgi_param DOCUMENT_ROOT /home/mypage/public_html;
    fastcgi_param SERVER_PROTOCOL $server_protocol;
    fastcgi_param REMOTE_ADDR $remote_addr;
    fastcgi_param REMOTE_PORT $remote_port;
    fastcgi_param SERVER_ADDR $server_addr;
    fastcgi_param SERVER_PORT $server_port;
    fastcgi_param SERVER_NAME $server_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS $https;
    location ~ \.php(/|$) {
        try_files $uri =404;
        fastcgi_pass unix:/var/php-nginx/123123123123123123.sock/socket;
    }
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    listen 1.1.1.1:443 ssl;
    ssl_certificate /home/mypage/ssl.combined;
    ssl_certificate_key /home/mypage/ssl.key;
    
    if ($blocked_bots = 1) {
        return 444; # Connection closed without response
    }
    if ($search_engines = 1){
        rewrite ^/(.*) /bot.php?$1 break;
    } 
    
    if ($scheme = http) {
        rewrite ^/(?!.well-known)(.*) https://mypage/$1 break;
    }
    
    location / {
        try_files $uri /index.html;
        auth_basic "Administrator’s Area";
        auth_basic_user_file /home/mypage/.htpasswd;
    }
    
    # Cache-Controll
    include /etc/nginx/conf.d/manuallyInclude/cache-policy.conf;
}

2番目の質問: social_network ボット用に別のマップされた変数があります。マッピングごとに、次のような独自の if 句を追加する必要がありますか?

    if ($search_engines = 1){
        rewrite ^/(.*) /bot.php?$1 break;
    } 
    if ($social_networks = 1){
        rewrite ^/(.*) /bot.php?$1 break;
    } 

または、それらを 1 つの書き換えルールに結合するより簡単な方法はありますか?

答え1

2 番目の質問に答えると、翻訳では「0」の代わりに空の文字列を使用しますmap(デフォルトmap値は空の文字列であるため、default行を省略できます)。

map $http_user_agent $search_engines {
    "~bingbot" 1;
    "~BingPreview" 1;
    "~Googlebot" 1;
}
map $http_user_agent $social_networks {
    "~*facebook" 1;
    "~*twitter" 1;
}

最終条件の決定には変数の連結を使用します。

map $search_engines$social_networks $is_bot {
    ""      "";
    default 1;
}

server {
    ...
    if ($is_bot) {
        rewrite ^/(.*) /bot.php?$1 break;
    } 

関連情報