¿Importa en qué orden se colocan las reglas en htaccess?

9

Espero que esta sea una respuesta simple SÍ o NO (especifique por qué)

P1: ¿Importa en qué orden se colocan las reglas en htaccess? Como son elementos completamente separados: por ejemplo

P2: En caso afirmativo, ¿estoy aplicando el pedido correcto? para acelerar el motor htacces y no sobrecargarlo con reglas innecesarias?

P3: ¡cualquier consejo sobre qué deshabilitar / agregar aquí es muy bienvenido +1!


# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /

#####################################################

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M172800
    Header unset ETag
    FileETag None
    Header unset Pragma

    ##### STATIC FILES
    <FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
        ExpiresDefault M1209600
        Header set Cache-Control "public, max-age=1209600"
    </FilesMatch>

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(php)$">
        ExpiresDefault M604800
        Header set Cache-Control "public, max-age=604800"
    </FilesMatch>
</IfModule>

#####################################################

#  /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$  /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

####################################################

# NO WWW   http://www. becomes always http://
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz

##############################################################

ErrorDocument 500 /
ErrorDocument 404 /
Sam
fuente

Respuestas:

10

Bueno, los archivos .htaccess usan el mismo formato que el archivo de configuración de Apache normal, por lo que se aplican las mismas reglas.

La mayoría de las configuraciones no dependen del orden, pero algunas sí, dependen de la configuración.

RewriteRuley, RewriteCondpor ejemplo, son sensibles al orden, por lo que en ese caso la respuesta es SÍ.

Ver por ej.

http://wiki.apache.org/httpd/RewriteRule

para una explicación del orden en que estos son evaluados.

sleske
fuente
4

Si importa. Citando de la documentación para RewriteRule :

El orden en que se definen estas reglas es importante: este es el orden en que se aplicarán en tiempo de ejecución.

Flimm
fuente
1
Dentro de mod_rewrite, es importante, sí. Sin embargo, el OP no está abordando específicamente mod_rewrite y hay muchas otras directivas de otros módulos en el .htaccessarchivo del OP . En resumen, las directivas de diferentes módulos (y en diferentes contenedores ) se ejecutan de forma independiente y en un orden predefinido, independientemente de su orden aparente en el archivo de configuración.
MrWhite
1

No puedo hablar sobre cómo el orden de <files>vs <Rewrite>, por ejemplo, afecta el rendimiento. Estoy tratando de descubrirlo yo mismo. No he podido encontrar ninguna información sobre esto, ¿entonces posiblemente no importa?

Sin embargo, me gustaría señalar que entre Rewritevs Redirect(y RedirectMatch), el orden de ejecución puede no estar en el orden indicado, aunque a menudo eso es lo que la gente puede esperar.
Específicamente, los módulos mod_rewritey mod_aliasse procesan / ejecutan de forma independiente, y en ese orden

  1. Todas las directivas mod_rewrite ( Rewrite) se ejecutan (en el orden en que aparecen).
  2. ENTONCES, todas las directivas mod_alias ( Redirecty RedirectMatch) se ejecutan en el orden en que aparecen en el archivo.

Por lo tanto, incluso si Redirectprocede a Rewrite, el redireccionamiento se procesará solo después de que se hayan procesado todas las reescrituras.

Una forma de mantener el archivo "legible" si tiene redireccionamientos y reescrituras, es no usar el mod_aliasmódulo en absoluto. En su lugar, use solo mod_rewrite. Reescribir con la bandera [R] esencialmente lo convierte en una reescritura.
La respuesta de este webmaster muestra cómo.

Ahora, todas las directivas se ejecutarán en el orden en que aparecen en el archivo, por lo que no hay sorpresas desagradables ni confusión sobre el orden de ejecución. Alternativamente, podría reubicar físicamente todas las directivas Redirecty RedirectMatchen la "parte inferior" del archivo, para recordar que no se ejecutarán hasta después del Rewrites de todos modos.

Aquí hay algunas buenas respuestas de StackExchange que se iluminaron hasta este punto:

En cuanto al resto, no he podido encontrar ninguna información sobre el rendimiento entre la colocación filesantes o después de rewrites, por ejemplo. El único consejo basado en el rendimiento que encontré es que si uno tiene acceso a los archivos de configuración del servidor, entonces es mejor moverse tanto como sea posible del archivo .htaccess al archivo de configuración, y deshabilitar los archivos .htaccess por completo (o especificar directorios específicos donde Los archivos .htaccess deben leerse).

La lógica es que las reglas colocadas en el archivo de configuración solo necesitan leerse una vez. Si el procesamiento de htaccess está activado, para cada solicitud, se debe buscar en todos los directorios del servidor (en el directorio solicitado o más alto) posibles archivos de htaccess, existan o no. Y si lo hacen, cada uno debe leerse de nuevo.

SherylHohman
fuente
-1

Tengo la misma preocupación publicada, pero esta es una perspectiva del sitio de administración del servidor que les permite reiniciar apache después de un cambio de configuración del servidor apache.

Hasta ahora, la mejor respuesta que he recibido es enumerar primero las directivas relacionadas con archivos.

Esto tiene sentido en relación con la necesidad de Apache de administrar directorios e instrucciones htaccess en cada directorio.

Entonces, primero enumere las directivas relacionadas con el archivo, luego los bloques obvios para finalizar el proceso de acceso a apache en el orden de lo obvio.

Posible solución para optimizar las solicitudes: - solicitar correcciones relacionadas con la URL - Restricciones relacionadas con el directorio - Restricciones relacionadas con el índice - Restricciones relacionadas con el archivo - Restricciones de proxy <- Eliminar todo - Agente de usuario vacío <- Eliminar todo ... la lista es diversión sin fin

Mi preocupación relacionada con la secuencia de directivas. Por ejemplo, ¿debo establecer las directivas Index, file y Header antes de RewriteConds?

Banco de pruebas
fuente
nota al pie: Sustitución del patrón RewriteRule [banderas] ¡No conteste esta pregunta obvia de procesamiento de aplicaciones!
Testbench