276 votos

Redirigir, Cambio de Url o de Redirección de HTTP a HTTPS en Apache - Todo lo que Usted Siempre Quiso Saber Acerca de las Reglas de Mod_Rewrite, pero Se atrevió a Preguntar

Este es un Canónica Pregunta acerca de Apache mod_rewrite.

El cambio de una dirección URL de la solicitud o redirigir a los usuarios a una URL distinta de la que originalmente solicitó se hace usando mod_rewrite. Esto incluye cosas tales como:

  • El cambio de HTTP a HTTPS (o al revés)
  • El cambio de una solicitud a una página que ya no existe para un nuevo reemplazo.
  • La modificación de un formato de URL (como ?id=3433 /id/3433 )
  • La presentación de una página diferente basado en el navegador, basado en la referencia, con base en lo posible bajo la luna y el sol.
  • Cualquier cosa que usted quiere ensuciar alrededor con URL

Todo lo que Usted Siempre Quiso Saber acerca de las Reglas de Mod_Rewrite, pero no Se atrevía a Preguntar!

¿Cómo puedo convertirme en un experto en la escritura de reglas de mod_rewrite?

  • Lo fundamental es la de formato y la estructura de reglas de mod_rewrite?
  • Qué forma/sabor de expresiones regulares necesito tener un sólido conocimiento de los?
  • ¿Cuáles son los errores más comunes/trampas en la escritura de reglas de reescritura?
  • ¿Qué es un buen método para las pruebas y la verificación de reglas de mod_rewrite?
  • Hay SEO o consecuencias en el rendimiento de mod_rewrite reglas que debo tener en cuenta?
  • Hay situaciones comunes donde mod_rewrite podría parecer que la herramienta correcta para el trabajo pero, ¿no?
  • ¿Cuáles son algunos de los ejemplos más comunes?

Un lugar para probar sus reglas

El htaccess probador sitio web es un gran lugar para jugar con sus reglas, y prueba de ellos. Incluso se muestra la salida de depuración para que pueda ver lo coincidente y lo que no.

235voto

sysadmin1138 Puntos 86362

mod_rewrite sintaxis de la orden

mod_rewrite tiene algunos específicos de ordenar las reglas que afectan al procesamiento. Antes de que nada se puede hacer, el RewriteEngine On directiva necesita ser dado como este se convierte en el mod_rewrite de procesamiento. Esto debe ser antes de cualquier otra reescritura de las directivas.

RewriteCond anterior RewriteRule hace que UNA regla sujeta a la condicional. De cualquier RewriteRules serán tratados como si no estuvieran sujetos a condiciones.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

En este caso simple, si el HTTP referrer de serverfault.com, redireccionar el blog de peticiones especiales serverfault páginas (sólo estamos especiales). Sin embargo, si el bloque de arriba había un extra RewriteRule línea:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

Todos .los archivos jpg iría a la especial serverfault páginas, no sólo aquellos con una referencia que indica que era de aquí. Esto claramente no es la intención de la cómo estas reglas están escritas. Se puede hacer con múltiples RewriteCond reglas:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Pero, probablemente, debe ser hecho con un poco más complicado de reemplazo de la sintaxis.

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

El más complejo RewriteRule contiene los condicionales para su procesamiento. El último paréntesis, (html|jpg) dice RewriteRule a partido, ya sea para html o jpg, y para representar a la cadena coincidente como $2 en la nueva cadena. Esto es lógicamente idéntica a la anterior bloque, con dos RewriteCond/RewriteRule pares, sólo lo hace en dos líneas en lugar de cuatro.

Varios RewriteCond líneas son implícitamente ANDed, y puede ser explícitamente de Bits. Para manejar referentes de ambos ServerFault y Super Usuario (O explícito):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

Para servir ServerFault se refiere a las páginas con los navegadores google Chrome (implícita):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBase es también de orden específico, ya que especifica la forma siguiente RewriteRule directivas controlan su procesamiento. Es muy útil en el .archivos htaccess. Si se utiliza, debe ser la primera directiva en "RewriteEngine on" en la an .archivo htaccess. Tomemos este ejemplo:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Esto está diciendo mod_rewrite que este URL en particular es en la actualidad el manejo que se llegó por medio de http://example.com/blog/ en lugar de la física ruta de acceso del directorio (/home/$Usuario/public_html/blog) y tratar en consecuencia. Debido a esto, el RewriteRule considera que es la cadena de inicio después de la "/blog" en la URL. Aquí es la misma cosa por escrito de dos formas diferentes. Uno con RewriteBase, el otro sin:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Como se puede ver, RewriteBase permite a las reglas de reescritura para aprovechar el web-sitio de la ruta de acceso a los contenidos de la web-servidor, lo que los puede hacer más inteligible para aquellos que editar este tipo de archivos. También, se pueden hacer las directivas corta, que tiene un atractivo estético.


RewriteRule sintaxis de coincidencia

RewriteRule en sí tiene una sintaxis compleja para la coincidencia de cadenas. Voy a cubrir las banderas (cosas como [PT]) en otra sección. Debido a que los Administradores de sistemas aprenden mediante el ejemplo más a menudo que mediante la lectura de un hombre-página les voy a dar ejemplos y explicar lo que hacen.

RewriteRule ^/blog/(.*)$    /newblog/$1

El .* construir coincide con cualquier carácter individual (.) cero o más veces (*). La encierra en paréntesis indica que la cadena que se ha igualado como el de $1 variable.

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

En este caso, la primera .* NO fue encerrada en paréntesis por lo que no proporciona a la nueva cadena. Esta norma elimina un nivel de directorio en el nuevo blog-sitio. (/blog/2009/sample.html se convierte en /newblog/sample.html).

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

En este caso, el primer paréntesis de la expresión establece una coincidencia con el grupo. Esto se convierte en $1, el cual no es necesario y por lo tanto no se utiliza en la nueva cadena.

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

En este caso, usamos $1 en la nueva cadena.

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

Esta regla se utiliza una sintaxis especial de corchetes que especifica un personaje de rango. [0-9] coincide con los números del 0 al 9. Esta norma específica controlará los años de 2000 a 2099.

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

Esto hace lo mismo que con la anterior regla, pero el {2} porción le dice de ti para que coincida con el carácter anterior (un soporte de expresión en este caso) dos veces.

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

Este caso coincide con cualquier letra minúscula en la segunda coincidencia de expresión, y lo hacemos con tantos caracteres como se puede. El \. construir dice para tratar el período período actual, no el carácter especial es que en los ejemplos anteriores. Se va a romper si el nombre de archivo tiene guiones en los que, aunque.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

Esto atrapa archivo-nombres con guiones en ellos. Sin embargo, como - es un carácter especial en el soporte de expresiones, tiene que ser el primer carácter de la expresión.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Esta versión trampas de cualquier nombre de archivo con letras, números o el - de caracteres en el nombre de archivo. Esta es la forma de especificar múltiples conjuntos de caracteres en un soporte de expresión.


RewriteRule banderas

Las banderas en las reglas de reescritura disponen de una serie de significados especiales y los escenarios de uso.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

La flag es el [L] al final de la expresión anterior. Varios indicadores pueden ser utilizados, separados por una coma. Los enlaces de la documentación describe cada uno, pero aquí están de todos modos:

L = Último. Detener el procesamiento de RewriteRules una vez que este uno de los partidos. Fin de cuenta!
C = Cadena. Continuar con el proceso de la siguiente RewriteRule. Si esta regla no coinciden, entonces la siguiente regla no será ejecutado. Más sobre esto más adelante.
E = variable ambiental. Apache tiene diversas variables ambientales que pueden afectar la web de comportamientos de servidor.
F = Prohibido. Devuelve un 403-Forbidden error si esta regla se cumple.
G = Ido. Devuelve un 410-Ido de error si esta regla se cumple.
H = Controlador. Las fuerzas de la solicitud para ser manejado como si se tratara de la especificada tipo de MIME.
N = Siguiente. Las fuerzas de la regla para empezar de nuevo y volver a coincidir. CUIDADO! Los bucles pueden ser el resultado.
NC = No hay caso. Permite a jpg a coincidir con los jpg y JPG.
NE = No hay escape. Previene la re-escritura de los caracteres especiales (. ? # & etc) en su hex-código equivalentes.
NS = No subrequests. Si usted está utilizando el servidor-lado-incluye, esto evitará que los partidos a los archivos incluidos.
P = Proxy. Las fuerzas de la regla para ser manejado por mod_proxy. De forma transparente proporcionar el contenido de otros servidores, porque el servidor web recopila y re-sirve. Este es un peligroso flag, como un mal escrita, uno volverá a su servidor web en un abrir proxy y lo Que es Malo.
PT = Pasar a Través. Tomar en cuenta las declaraciones de Alias en RewriteRule coincidencia.
QSA = QSAppend. Cuando la cadena original contiene una consulta (http://example.com/thing?asp=foo) anexar el original de la cadena de consulta para la nueva cadena. Normalmente sería descartado. Importante para el contenido dinámico.
R = La Redirección. Proporcionar una redirección HTTP a la URL especificada. También puede proporcionar exacta código de redirección [R=303]. Muy similar a RedirectMatch, que es más rápido y debe utilizarse cuando sea posible.
S = Saltar. Omitir esta regla.
T = Tipo. Especificar el tipo mime del contenido devuelto. Muy similar a la AddType directiva.


Usted sabe cómo me dijo que RewriteCond se aplica a una y sólo una regla? Bien, usted puede conseguir alrededor de ese encadenamiento.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Porque la primera RewriteRule tiene la Cadena de la flag, el segundo reescribir la regla se ejecutará cuando el primero hace, que es cuando el anterior RewriteCond regla coincide. Útil si Apache regular las expresiones de hacer de dolor a su cerebro. Sin embargo, el todo-en-uno-método de la línea I, punto en el primer apartado es el más rápido de una optimización del punto de vista.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Esto puede ser más sencillo a través de indicadores:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

También, algunos de los indicadores también se aplican a RewriteCond. En Particular, NoCase.

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

Coincidirá con "ServerFault.com"

40voto

danlefree Puntos 2418

¿Cuál es el formato fundamentales y la estructura de reglas de mod_rewrite?

Me voy a ceder a sysadmin1138 excelente respuesta en estos puntos.

Qué forma/sabor de regular expresiones necesito tener una sólida comprender?

Además de la sintaxis de la orden, la sintaxis de coincidencia/expresiones regulares, y RewriteRule indicadores descritos por sysadmin1138, creo que cabe mencionar que el mod_rewrite expone Apache variables de entorno basado en los encabezados de solicitud HTTP y de configuración de Apache.

Yo recomendaría AskApache del mod_rewrite de Depuración Tutorial para una lista completa de las variables que pueden estar disponibles para el mod_rewrite.

¿Cuáles son los más comunes errores/trampas en la escritura de reescritura reglas?

La mayoría de los problemas con RewriteRule la madre de un malentendido de PCRE sintaxis/falla para escapar caracteres especiales o una falta de comprensión sobre el contenido de la variable(s) que se utiliza para la comparación.

Problemas típicos y recomendados de solución de problemas:

  • 500 - Error Interno del Servidor - Quitar Windows transporte de los controles en el archivo de configuración(s) si está presente, asegúrese de que el mod_rewrite está habilitado (wrap directivas en IfModule condicional para evitar este escenario), comprobar la sintaxis de la directiva, comentario directivas hasta que se ha identificado el problema
  • Redirigir bucle - Hacer uso de RewriteLog y RewriteLogLevel, comentario directivas hasta que se ha identificado el problema

¿Qué es un buen método para las pruebas y la verificación de reglas de mod_rewrite?

En primer lugar, mira el contenido de la variable de entorno(s) que usted planea partido contra el - si usted tiene PHP instalado, esto es tan simple como agregar el siguiente bloque para su aplicación:

<?php
  var_dump($_SERVER);
?>

... a continuación, escribir sus reglas (de preferencia para realizar pruebas en un servidor de desarrollo) y tomar nota de cualquier inconsistente juego o actividad en el Apache de registro de errores de archivo.

Para reglas más complejas, el uso de mod_rewrite del RewriteLog directiva para la actividad de registro en un archivo y establezca RewriteLogLevel 3

Hay SEO o el rendimiento implicaciones de las reglas de mod_rewrite yo debe ser consciente de?

AllowOverride all impactos en el rendimiento del servidor como Apache debe comprobar .htaccess archivos y analizar las directivas con cada solicitud - si es posible, mantenga todas las directivas en el VirtualHost de configuración para su sitio web o habilitar .htaccess anula sólo para los directorios que necesita.

Google Webmaster Directrices explícitamente: "no engañes a los usuarios o presente un contenido diferente a los motores de búsqueda que usted muestra a los usuarios, que es la comúnmente conocida como" encubrimiento.'" - evitar la creación de mod_rewrite directivas de filtro para los robots de motores de búsqueda.

Robots de motores de búsqueda prefieren un 1:1 contenido:URI de la asignación (esta es la base para la clasificación de enlaces a contenidos) - si usted está usando mod_rewrite para crear redirecciones temporales o está sirviendo el mismo contenido en múltiples URI, considere la posibilidad de especificar un canónica URI dentro de los documentos HTML.

Hay situaciones comunes donde mod_rewrite podría parecer que el derecho herramienta para el trabajo pero, ¿no?

Este es un enorme (y polémico) tema en su propio derecho - mejor (en mi humilde opinión) a la dirección de los usos en un caso-por-caso base y dejar que askers determinar si las resoluciones propuestas son adecuadas para sus necesidades.

¿Cuáles son algunos de los ejemplos más comunes?

AskApache del mod_rewrite Trucos y Consejos cubre casi todos los comunes de caso de uso que aparece con regularidad, sin embargo, la solución "correcta" para un usuario determinado, puede depender de la complejidad de la configuración del usuario y las directivas existentes (razón por la cual es generalmente una buena idea para ver que otras directivas que un usuario tiene en su lugar cuando una mod_rewrite pregunta viene).

21voto

TerryE Puntos 279

Como muchos admin/desarrolladores he estado luchando con las complejidades de las reglas de reescritura para años y estoy contento con el existente en la documentación de Apache, así que me decidí como un proyecto personal para llegar a la parte inferior de cómo mod_rewrite realmente funciona e interactúa con el resto del núcleo de Apache, por lo que durante los últimos meses he estado instrumentar los casos de prueba con strace + de perforación en el código fuente para conseguir una manija en todo esto.

Aquí están algunos de los principales comentarios que la regla de reescritura de los desarrolladores deben considerar:

  • Algunos aspectos de la reescritura son comunes a la configuración del servidor, host virtual, directorio .htaccess procesamiento sin embargo
  • Algunos de procesamiento es muy diferente de la root config (configuración del servidor, host virtual y directorio), a diferencia del PerDir (.htaccess) de procesamiento.
  • Peor porque PerDir el procesamiento de casi indiscriminadamente gatillo INTERNO REDIRIGIR el ciclismo, la root de configuración de los elementos que tienen que ser escritos en cuenta que tales PerDir procesamiento puede desencadenar este.

Me gustaría ir como fas, como para decir que debido a esto es casi necesario dividir la reescritura de las comunidades de usuarios en dos categorías, y tratarlos como totalmente independientes:

  • Aquellos con acceso a la root de la configuración de Apache. Estos suelen ser administrador/desarrollador con una aplicación de servidor dedicado/VM, y aquí el mensaje es muy simple: evitar el uso de .htaccess archivos si es posible; hacer todo en su servidor o vhost config. La depuración es razonable fácil, ya que el programador puede establecer la depuración y tiene acceso a la reescritura.los archivos de registro.

  • Los usuarios de un hosting compartido, servicio (SHS).

    • Estos usuarios tienen el uso de .htaccess / Perdir procesamiento como no hay otra alternativa disponible.
    • Peor aún, el nivel de habilidad de dichos usuarios (tan lejos como el uso de la regexp impulsado por la escalera de la lógica de mod_rewrite) generalmente es significativamente menor que el experimentado administradores.
    • Apache y los proveedores de hosting ofrecen ninguna de depuración o de apoyo diagnóstico. La única información de diagnóstico es un éxito de la redirección, una redirección a una URI. o un 404/500 código de estado. Esto les deja confundido e indefenso.
    • Apache es extremadamente débil, explicando cómo la reescritura de obras para este caso de uso. Por ejemplo, no proporciona una explicación clara de lo que PerDir .htaccess archivo es seleccionado y por qué. No explica las complejidades de PerDir ciclismo y cómo evitar esto.

Hay posiblemente un tercio de la comunidad: la administración y el personal de apoyo en SHS proveedores que terminan con un pie en ambos campos y tienen que sufrir las consecuencias de la anterior.

He escrito un par de artículo de estilo de publicaciones en el blog (e.g Más sobre el uso de reglas de Reescritura .archivos htaccess) que cubre un montón de detallar los puntos que no voy a repetir aquí para mantener a este post corto. Tengo mi propio servicio compartido, así como el apoyo de algunos dedicado & VM proyectos FLOSS. Empecé con una LÁMPARA estándar de VM como un vehículo de prueba para mi SHS cuenta, pero al final me pareció mejor que hacer un buen espejo de la VM (que se describe aquí).

Sin embargo, en términos de cómo el administrador de la comunidad debe apoyar a .htaccess usuarios, creo que tenemos que desarrollar y ofrecer:

  • Una descripción coherente de cómo la reescritura sistema realmente funciona en PerDir procesamiento de
  • Un conjunto de directrices y mejores prácticas sobre cómo escribir .htaccess reglas de reescritura
  • Un simple basada en web de reescritura de guión analizador de tipo similar a la W3C html analizadores, pero por el cual los usuarios pueden introducir la prueba de URIs o prueba de vectores de la misma y obtener una reacción inmediata de registro de la reescritura de flujo de la lógica/
  • Consejos sobre cómo obtener diagnóstico integrado de las reglas (por ejemplo,

    • Uso [E=VAR:EXPR] aprovechando el hecho de que EXPR ampliará retro-referencias ($N o %N) para hacerlos disponibles como diagnóstico para el destino de la secuencia de comandos.
    • Si usted tópicamente el fin de sus reglas de reescritura utilizando [O],[C],[SKIP] y [L] banderas de modo que toda la reescritura esquema funciona sin la necesidad de explotar los internos de la redirección, entonces usted puede agregar la siguiente regla 1 para evitar que todos los bucles de problemas:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

15voto

Krist van Besien Puntos 1347

El uso de rewritemap

Hay un montón de cosas que usted puede hacer con rewritemaps. Rewritemaps obtener declarado mediante la Rewritemap directiva, y puede ser utilizado tanto en RewritCond evaluaciones, y en RewriteRule Subsitutions.

La sintaxis general para RewriteMap es:

RewriteMap MapName MapType:MapSource

Por ejemplo:

RewriteMap examplemap txt:/path/to/file/map.txt

Usted puede utilizar el mapname para construcciones como esta:

${examplemap:key}

El mapa contiene pares clave/valor. Si la clave se encuentra, el valor es subsituted. Mapas sencillos son solo archivos de texto sin formato, pero se puede usar hash mapas, e incluso de consultas SQL. Más detalles en la documentación:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

Unescaping cadenas.

Hay cuatro interna de los mapas se pueden utilizar para hacer algún tipo de manipulación. Especialmente unescaping cadenas puede venir en práctico.

Por ejemplo: quiero poner a prueba para la cadena "café" en la cadena de consulta. Sin embargo, el navegador va a escapar de esta, antes de enviarlo a mi servidor, así que 'll necesidad de averiguar cuál es la dirección URL escapó versión es para cada cadena deseo partido, o solo puedo unescape...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

Nota cómo puedo usar una RewriteCond a sólo captura el argumento de pie el parámetro de cadena de consulta y, a continuación, utilizar el mapa de la segunda rewriteCond a unescape. Este, a continuación, se presenta la comparación. Tenga en cuenta también que necesito para nosotros %2 como clave en la rewritemap, como %1 contendrá "ubicación" o "lugar". Al utilizar paréntesis para agrupar los patrones también serán capturados, si usted planea utilizar el resultado de la captura o no...

12voto

beldaz Puntos 173

¿Cuáles son los más comunes errores/trampas en la escritura de reescritura reglas?

Un muy fácil de ellas es cuando la reescritura de direcciones Url que alteran la trayectoria aparente, por ejemplo, de /base/1234/index.html a /base/script.php?id=1234. Alguna de las imágenes o CSS con rutas relativas a la ubicación del script no será encontrado por el cliente. Un número de opciones para resolver esto se puede encontrar en esta sección de preguntas frecuentes.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: