2009-12-04 22 views
117

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..htaccess mod_rewrite - cómo excluir el directorio de la regla de reescritura

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

Por lo tanto, las solicitudes http: http://www.domain.com/admin/ no se deben pasar 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] 
+0

Creo que olvidó los cuantificadores después de '[^ /]' ya que un espacio simple si no está permitido allí (debe ser escapado con '\ '). – Gumbo

+0

True Gumbo, buena captura :). debería ser^([^ /] +). – Kelvin

Respuesta

233

Prueba esta regla antes de sus otras reglas:

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

Esto va a terminar el proceso de reescritura.

+0

Hola Gumbo, tu código funcionó si el usuario teclea domain.com/admin/ (con barra diagonal) pero no sin él. ¿Qué puede cambiar para que ambos casos funcionen? Gracias – Kelvin

+0

@ Kelvin: La alternancia '($ | /)' debe manejar ambos casos. – Gumbo

+0

¿No es mejor utilizar RewriteCond aquí en lugar de RewriteRule? – rineez

18

añadir una condición para comprobar si el directorio de administración, algo así 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] 
+0

Hola Rob, puse esta línea justo después de "RewriteBase /", y ahora estoy recibiendo "500 Error - Internal Server Error" – Kelvin

+0

@ Kelvin. Edité mi respuesta, agregué la condición antes de cada regla a la que desea que se aplique. – Rob

84

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

RewriteEngine Off 

En las carpetas que desea excluir de ser reescrita (por las reglas en un archivo .htaccess que está más arriba en el árbol). Simple pero efectivo

+16

+1 ~ .htaccess funciona jerárquicamente, por lo que las carpetas locales anulan a sus padres, al igual que una cascada normal en CSS o MVC. – Atari

+10

Maldita sea, ojalá hubiera aprendido esto hace una década ... – Rob

+6

De lejos, la mejor solución. Gracias – Dpedrinha

4
RewriteEngine On 

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

Se utilizó la siguiente regla mod_rewrite:!!

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

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

2

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

RewriteEngine on 

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

El RewriteRule anteriormente volverá a escribir todos los requestes a /index.php excluyendo las solicitudes de /foo/.

para excluir todos los directries existentes, tendrá que utilizar la siguiente condición por encima de su regla:

RewriteCond %{REQUEST_FILENAME} !-d 

la siguiente regla

RewriteEngine on 

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

reescribe todo (excepto directries) a /index. php.

Cuestiones relacionadas