.htaccess mod_rewrite: cómo excluir el directorio de la regla de reescritura

145

Tengo 8 líneas de reglas de reescritura en mi archivo .htaccess. Necesito excluir dos directorios físicos en mi servidor de estas reglas, para que puedan ser accesibles. Por ahora, todas las solicitudes se envían al archivo index.php.

Directorios a excluir: "admin" y "usuario".

Por lo tanto, las solicitudes http: http://www.domain.com/admin/ no deben pasarse al archivo index.php.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
Kelvin
fuente
Creo que olvidó los cuantificadores después, [^/]ya que un espacio simple si no se permite allí (se debe escapar con \<space>).
Gumbo
Verdadero Gumbo, buena captura :). debería ser ^ ([^ /] +).
Kelvin el

Respuestas:

287

Pruebe esta regla antes que sus otras reglas:

RewriteRule ^(admin|user)($|/) - [L]

Esto finalizará el proceso de reescritura.

Gumbo
fuente
Hola Gumbo, tu código funcionó si el usuario escribe domain.com/admin/ (con barra diagonal final) pero no sin él. ¿Qué se puede cambiar para que ambos casos funcionen? Gracias
Kelvin
@ Kelvin: La alternancia ($|/)debería manejar ambos casos.
Gumbo
¿No es mejor usar RewriteCond aquí en lugar de RewriteRule?
rineez
77
@rineez RewriteCondsiempre requiere un al RewriteRuleque está conectado. Y agregar esta condición como negado RewriteConda cada uno RewriteRulepuede ser bastante voluminoso, una sola RewriteRulecomo una salida por encima de las que deberían ignorarse en ese caso es más elegante.
Gumbo
3
@Ergec Significa "no cambiar nada".
Gumbo
112

Lo que también podría hacer es poner un archivo .htaccess que contenga

RewriteEngine Off

En las carpetas que desea excluir de la reescritura (según las reglas en un archivo .htaccess que está más arriba en el árbol). Simple pero efectivo.


fuente
18
+1 ~ .htaccess opera jerárquicamente, por lo que las carpetas locales anulan a sus padres, como una cascada normal en CSS o MVC.
Atari
44
solo hay una cosa que debe tener en mente: la activación de archivos .htaccess (configurando AllowOverridecualquier otra cosa que no sea Noneen la configuración de apache) obliga a apache a buscar .htaccess en cada solicitud. por lo que si usted tiene un sitio web de alto frecuentados / servidor web que el sistema de archivos / disco duro de acceso podría tener un impacto en el rendimiento imense ...
bohrsty
Consejo perfecto para validar la renovación de certificados SSL a través del método de archivo. No es necesario modificar nada fuera de los directorios temporales o en el archivo vhost. Una vez que se realiza la validación, puede eliminar toda la carpeta y listo. Simplemente genial.
Countzero
25

agregue una condición para verificar el directorio de administración, algo como:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]
Robar
fuente
Hola Rob, puse esta línea justo después de "RewriteBase /", y ahora obtengo "Error 500 - Error interno del servidor"
Kelvin
@ Kelvin Edité mi respuesta, agregue la condición antes de cada regla a la que desea que se aplique.
Rob
Este fue el único que realmente me ayudó. La respuesta aceptada no me ayudó.
Uwe Keim
5

Si desea eliminar un directorio particular de la regla (es decir, desea eliminar el directorio foo ), puede usar:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

La rewriteRule anterior reescribirá todas las solicitudes a /index.php excluyendo las solicitudes de / foo / .

Para excluir todas las directivas existentes, deberá utilizar la siguiente condición sobre su regla:

RewriteCond %{REQUEST_FILENAME} !-d

la siguiente regla

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

reescribe todo (excepto las directivas ) a /index.php .

Amit Verma
fuente
5

Utilizamos la siguiente regla mod_rewrite:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Esto redirige (permanentemente con una redirección 301) todo el tráfico al sitio a http://www.newdomain.com , excepto las solicitudes de recursos en los directorios / test y / my-folder. Transferimos al usuario al recurso exacto que solicitaron utilizando el grupo de captura (. *) Y luego incluyendo $ 1 en la nueva URL. Cuidado con los espacios.

Camilo Tilaguy
fuente
4
RewriteEngine On

RewriteRule ^(wordpress)($|/) - [L]
usuario3578691
fuente