Intento portar mi .htaccess anterior (usado con Apache) a 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>
Lo siguiente es lo que intento actualmente:
He generado un mapa como Lista de SearchEngine:
map $http_user_agent $search_engines {
default 0;
"~bingbot.*" 1;
"~BingPreview.*" 1;
"~Googlebot.*" 1;
}
if ($search_engines = 1){
rewrite ^/(.*) bot.php?$1 break;
}
Pero esto crea un bucle infinito.
Aquí está el bloque de servidor completo:
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;
}
Segunda pregunta: Tengo otro variable mapeado para bots de redes sociales. ¿Realmente necesito agregar para cada mapeo una cláusula if propia como esta?
if ($search_engines = 1){
rewrite ^/(.*) /bot.php?$1 break;
}
if ($social_networks = 1){
rewrite ^/(.*) /bot.php?$1 break;
}
¿O hay una manera más fácil de combinarlos en una regla de reescritura?
Respuesta1
Respondiendo a su segunda pregunta, use una cadena vacía en lugar de "0" en sus map
traducciones (y dado que el map
valor predeterminado es exactamente una cadena vacía, puede omitir la default
línea):
map $http_user_agent $search_engines {
"~bingbot" 1;
"~BingPreview" 1;
"~Googlebot" 1;
}
map $http_user_agent $social_networks {
"~*facebook" 1;
"~*twitter" 1;
}
y utilice la concatenación de variables para la decisión de condición final:
map $search_engines$social_networks $is_bot {
"" "";
default 1;
}
server {
...
if ($is_bot) {
rewrite ^/(.*) /bot.php?$1 break;
}