Reescribir Introducción a Reescribir
En muchos casos, el acceso a una determinada IP puede provocar fácilmente un CPU 100 (como el rastreo fijo de algunos motores de búsqueda y una gran cantidad de sitios de recopilación de otros. En este momento, debemos utilizar algunos). medios efectivos para bloquear el acceso. Bloquear la IP de la otra parte para que no pueda consumir los recursos del servidor. Hay muchas formas de bloquear la IP. Si su servidor web tiene el módulo Rewrite instalado, también puede intentar usar reglas de Rewrite para bloquear el acceso. IP de la otra parte.
Por ejemplo, redirigimos una IP específica directamente a la página de inicio de Baidu y agregamos el código en el archivo .htaccess en el directorio raíz del sitio web:
Código:
RewriteCond 123.123.123.123 [NC]
RewriteRule ^(.*)$ /$1 [R=301]
Reemplace la IP 123.123.123.123 con la IP que desea restringir . Si desea implementar varias IP, puede escribir así:
RewriteCond 123.123.123.123 [OR]
RewriteCond 124.124.124.124 [NC]
RewriteRule ^(. *)$ /$1 [R=301] La función principal de Rewrite es implementar la reescritura de URL. Sus expresiones regulares se basan en el lenguaje Perl y las reglas de entrada se utilizan para modificar las URL de solicitud HTTP. Estas reglas pueden servir para varios propósitos, como mostrar un espacio de nombres de URL más fácil de usar para su sitio web, redirigir las URL solicitadas a una nueva ubicación o bloquear el acceso a las URL. Las reglas de reescritura saliente modifican las respuestas HTTP. Por ejemplo, si la estructura de navegación de su sitio web ha cambiado, puede crear reglas de salida que modifiquen las URL de su contenido para que el contenido de la página web apunte a la ubicación correcta. Luego puede crear una regla de entrada que redirija las solicitudes de los clientes según la ubicación de la caché y la nueva URL. Se puede aprender en función del nivel del servidor (/. Aquí damos un ejemplo sencillo para ilustrar su uso.
Supongamos que desea implementar una función de reescritura de este tipo: desea saber cuándo accede el usuario a / about.htm (usted (about.htm no necesita existir en el espacio), el acceso real es /index.html
El método de configuración es:
1. Cree un archivo de texto con el contenido:
[ISAPI_Rewrite]
RewriteRule /about\.htm /index\.html
Aquí, la línea RewriteRule es la línea de regla , que consta de tres partes Consta de tres partes separadas por espacios. La primera parte son las palabras RewriteRule, la segunda parte es la dirección visitada por el usuario (usando expresiones regulares) y la tercera parte es la ruta del archivo que realmente existe. en el servidor.
2. Guarde el archivo anterior y asígnele el nombre www.name2.com. Nos aseguraremos de que cuando visite www.name1.com, vea el contenido en la raíz del archivo. sitio web, y cuando visite www.name2.com, verá que es el contenido en la carpeta /name2/
Entonces los pasos de configuración son los siguientes:
1. Agrupe su sitio web con los nombres de dominio www.name1.com y www.name2.com. Es muy importante que ambos nombres de dominio estén agrupados. Si no se realizan configuraciones en este momento, ambos nombres de dominio accederán a la raíz del sitio web.
2. Modifique
# en la pregunta 1 anterior para indicar que la siguiente línea de reglas solo tiene efecto para www.name2.com (\. en la expresión regular representa . en sí). ).
RewriteRule ^(.*)$ /name2/$1 [I]
# significa Reescribir todas las páginas web en la carpeta nombre2, [I] significa ignorar mayúsculas y minúsculas.
Confirme que el contenido anterior esté debajo de la línea [ISAPI_Rewrite]. Si el archivo httpd.ini no existe en el sitio web original, agregue [ISAPI_Rewrite] delante del contenido anterior.
3. Cargue el httpd.ini modificado en la raíz del sitio web para sobrescribir el archivo original.
A través de este método, puede aplicar cualquier regla de Rewirte específica a cualquier nombre de dominio incluido en el sitio web y, por supuesto, es fácil lograr funciones similares a agrupar subdirectorios. De esta manera, puede crear tantos sitios web con diferentes contenidos como espacio pueda incluir nombres de dominio. El módulo ngx_http_rewrite_module permite el reemplazo regular de URI, la redirección de página de retorno y la selección condicional de configuraciones.
Las directivas del módulo ngx_http_rewrite_module se procesan en el siguiente orden: Procesar las directivas del módulo definidas en el nivel del servidor; Buscar la ubicación para la solicitud; Procesar las directivas del módulo definidas en la ubicación seleccionada; Si la directiva cambia el URI, se busca la ubicación según el nuevo URI. Este ciclo se repite hasta 10 veces, después de lo cual nginx devuelve el error 500 (Error interno del servidor). Sintaxis de la instrucción: break; Valor predeterminado: - Contexto: servidor, ubicación, si Deje de procesar la ronda actual del conjunto de instrucciones ngx_http_rewrite_module.
Ejemplo:
if ($slow) { limit_rate 10k; break;} Sintaxis: if (condición) { ... } Valor predeterminado: - Contexto: servidor, ubicación Especificación de cálculo El valor de la condición. Si es verdadero, ejecute la directiva del módulo de reescritura definida entre llaves y asigne la configuración en la directiva if a la solicitud. La directiva if heredará la configuración de la configuración de capa anterior.
La condición puede ser cualquiera de las siguientes: nombre de la variable; si el valor de la variable está vacío o es una cadena que comienza con "0", la condición es falsa; utilice los operadores "=" y "!="; Compare variables y cadenas; utilice los operadores "~" (distingue entre mayúsculas y minúsculas) y "~*" (no distingue entre mayúsculas y minúsculas) para hacer coincidir variables y expresiones regulares. Las expresiones regulares pueden contener grupos coincidentes y posteriormente se puede hacer referencia a los resultados coincidentes utilizando las variables $1...$9. Si la expresión regular contiene los caracteres "}" o ";", toda la expresión debe estar entre comillas simples o dobles.
Utilice los operadores "-f" y "!-f" para comprobar si el archivo existe; utilice los operadores "-d" y "!-d" para comprobar si el directorio existe; Operadores e" para verificar si el archivo, directorio o enlace simbólico existe; use los operadores "-x" y "!-x" para verificar el archivo ejecutable; Ejemplo:
if ($http_user_agent ~ MSIE) { reescribir ^(.*) $ /msie/$1 break;}if ($http_cookie ~* id=([^;] )(?:;|$)) { establecer $id $1;}if ($request_method = POST ) { return 405;}if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403;}
El valor de la variable incrustada $invalid_referer se establece mediante la directiva valid_referers. Sintaxis: returncode[texto]; returncodeURL; returnURL; Valor predeterminado: - Contexto: servidor, ubicación, si Detiene el procesamiento y devuelve el código especificado al cliente. Devolver el código de estado no estándar 444 puede cerrar directamente la conexión sin devolver un encabezado de respuesta.
A partir de la versión 0.8.42, puede especificar la URL redirigida (los códigos de estado son 301, 302, 303 y 307) en la directiva, o especificar el texto del cuerpo de la respuesta (los códigos de estado son otros valores) . Las variables se pueden incluir en el texto del cuerpo de la respuesta o en la URL de redireccionamiento. Como caso especial, la URL de redireccionamiento se puede simplificar al URI local del servidor actual, luego la URL de redireccionamiento completa se completará de acuerdo con la configuración del protocolo de solicitud ($scheme), la directiva server_name_in_redirect y la directiva port_in_redirect.
Además, la URL utilizada para la redirección temporal con código de estado 302 se puede utilizar como único parámetro de la directiva. El parámetro debe comenzar con "http://", "https://" o "https://". Se pueden incluir variables en la URL.
Antes de la versión 0.7.51, solo se podían devolver los siguientes códigos de estado: 204, 400, 402-406, 408, 410, 411, 413, 416 y 500-504.
Hasta las versiones 1.1.16 y 1.0.13, el código de estado 307 no se consideraba una redirección. Sintaxis: rewriteregexreplacement[flag]; Valor predeterminado: - Contexto: servidor, ubicación, si Si la expresión regular especificada puede coincidir con el URI, el URI se reescribirá mediante la cadena definida por el parámetro de reemplazo. Las directivas de reescritura se ejecutan en el orden en que aparecen en el archivo de configuración. La bandera puede finalizar la ejecución de instrucciones posteriores. Si la cadena de reemplazo comienza con "http://" o "https://", nginx finalizará el proceso de ejecución y devolverá una redirección al cliente.
El parámetro de bandera opcional puede ser uno de ellos: last detiene la ejecución de la ronda actual de instrucciones ngx_http_rewrite_module y luego encuentra una nueva ubicación que coincide con el URI modificado; break detiene la ejecución de la ronda actual de instrucciones ngx_http_rewrite_module establecidas; se utiliza para devolver una redirección temporal con el código de estado 302 cuando la cadena de reemplazo no comienza con "http://" o "https://" permanente devuelve una redirección permanente con el código de estado 301.
La URL de redireccionamiento completa se completará de acuerdo con la configuración del protocolo de solicitud ($scheme), la directiva server_name_in_redirect y la directiva port_in_redirect.
Ejemplo:
servidor { ... reescribir ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 al final ; reescribir ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return ...}
Pero cuando el comando anterior escribe Cuando esté en la ubicación de "/descargar/", se debe usar la ruptura de bandera en lugar de la última; de lo contrario, nginx repetirá el ciclo durante 10 rondas y luego devolverá el error 500:
ubicación /descargar/ { reescribir ^(/descargar/. *)/media/(.*)\..*$ $1/mp3/$2.mp3 descanso; reescribir ^(/descargar/.*)/audio/(.*)\..*$ $1/mp3/$2. ra break; return 403;}
Si la cadena de reemplazo incluye nuevos parámetros de solicitud, los parámetros de solicitud anteriores se agregarán después de los nuevos parámetros. Si no desea esto, puede evitarlo agregando un signo de interrogación "?" al final de la cadena de reemplazo, por ejemplo:
reescribir ^/users/(.*)$ /show ?user=$1? last;
Si la expresión regular contiene los caracteres "}" o ";", toda la expresión debe estar entre comillas simples o dobles. Sintaxis: rewrite_logon|off; Valor predeterminado: rewrite_log off; Contexto: http, servidor, ubicación, si Activa o desactiva el registro de procesamiento de la instrucción del módulo ngx_http_rewrite_module en el registro de errores en el nivel de aviso. Sintaxis: setvariablevalue; Valor predeterminado: - Contexto: servidor, ubicación, si Establece el valor de la variable especificada. El valor puede contener texto, variables o una combinación de estos. Sintaxis: uninitialized_variable_warnon|off; Valor predeterminado: uninitialized_variable_warn on; Contexto: http, servidor, ubicación, si Controla si se registran advertencias de variables no inicializadas en el registro.
Implementación interna
Las instrucciones del módulo ngx_http_rewrite_module se compilan en instrucciones internas de nginx durante la fase de configuración de análisis. Estas instrucciones internas se interpretan y ejecutan al procesar una solicitud. El intérprete es una máquina de pila simple.
Por ejemplo, el siguiente comando
ubicación /descargar/ { if ($prohibido) { return 403; if ($slow) { limit_rate 10k } rewrite ^/(descargar; /. *)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;}
Se traducirá a las siguientes instrucciones:
variable $forbiddencheck contra cero return 403 final de la variable de código $slowcheck contra zeromatch de expresión regularcopiar /copiar $1copiar /mp3/copiar $2copiar .mp3fin de la expresión regularfin del código
Tenga en cuenta que no existe una directiva interna correspondiente a la directiva limit_rate anterior Porque esta directiva no tiene nada que ver con el módulo ngx_http_rewrite_module. nginx creará una configuración separada para este bloque if, incluyendo limit_rate igual a 10k. Si la condición es verdadera, nginx asignará esta configuración a la solicitud.
Comando
reescribir ^/(descargar/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
Puede guardar una instrucción interna poniendo la primera barra diagonal "/" en la expresión regular entre paréntesis:
reescribir ^(/download/.*)/media/ (.*)\.. *$ $1/mp3/$2.mp3 break;
El comando interno correspondiente será así:
coincidencia de expresión regularcopiar $1copiar /mp3/copiar $2copiar .mp3fin de regular expresión final del código