2012-10-12 78 views
8

Mi página no está redirigiendo como debería debido a mi archivo .htaccess que se establece como:excepción mod_rewrite para un archivo específico

RewriteEngine on 
RewriteCond $1 !^(index\.php|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

utilizo esta configuración para mi MVC así que conseguir URLs como /controller/method/argument embargo cuando redirijo a /forum/login.php, corta a/forum /.

¿Cómo puedo añadir esto como una excepción por lo que voy a ser capaz de redirigir a /forum/login.php

encontré otro .htaccess en mi/foro/directorio podía estar causando el problema así?

# BEGIN PunBB 

<IfModule mod_rewrite.c> 
    # MultiViews interfers with proper rewriting 
    Options -MultiViews 

    RewriteEngine On 

    # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly 
    #RewriteBase/

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . rewrite.php [L] 
</IfModule> 

Respuesta

21

Primero les voy a decir cómo leer su RewriteRule:

Se empieza con la primera (o siguiente) RewriteRule entrada:

RewriteRule ^(.*)$ index.php/$1 [L,QSA]

El primer parámetro es una expresión regular que puede coincidir con la URL solicitada. ^(.*)$ combina todo, y almacena este "todo" dentro de una variable que se puede usar más adelante.

sólo si hay precedente entradas RewriteCond, se evalúan siguiente:

RewriteCond $1 !^(index\.php|resources|robots\.txt)

$1 es una referencia al contenido emparejado dentro de los primeros paréntesis de RewriteRule. Esto se compara con el segundo parámetro, que es una expresión regular que indica varios nombres explícitos, y el ! niega la expresión, p. esta regla permite la ejecución de RewriteRule solo si la expresión regular no coincide. Si esta condición devuelve verdadero, se examinará la siguiente condición.

RewriteCond %{REQUEST_FILENAME} !-f

Si el nombre del archivo solicitado ningún archivo real en el disco duro, esta condición es verdadera.

RewriteCond %{REQUEST_FILENAME} !-d

Si el nombre del archivo solicitado es ningún directorio real, esta condición es verdadera.

Sólo si todas estas condiciones son verdaderas (que se encadenan con Y), volvemos a la regla de reescritura:

RewriteRule ^(.*)$ index.php/$1 [L,QSA]

El resultado de este paso de reescritura se define como la segunda y tercera parámetro. $1 se usa de nuevo como con el contenido de la coincidencia, y los parámetros definen que esta regla, si coincide inicialmente, será la última regla (L) y que cualquier cadena de consulta definida en el objetivo de reescritura se agregará a cualquier cadena de consulta en la URL original (QSA).

Crítica:

La reescritura de costumbre para los marcos MVC tratar de ser lo más performante como sea posible. Todas las condiciones de reescritura deben evaluarse para una reescritura exitosa. Se detendrá solo si alguno de RewriteCond devuelve falso. Toda solicitud que se reescribe está sujeta a muchas pruebas intensivas de la CPU. Primero la regex RewriteRule, luego la regex en la primera RewriteCond, seguida de dos pruebas de disco duro en el sistema de archivos para la existencia de archivos.

Por otro lado, el primer RewriteCond parece ser innecesario. Comprueba ciertos nombres, y si se encuentra, cancela la reescritura. "index.php" debería ser detectado por el segundo RewriteCond, porque es un archivo existente (cómo no funcionaría la reescritura). Cualquier cosa que comience con "recursos" también se emparejará, pero probablemente no debería ser por las mismas razones: los recursos existentes los encontrará el segundo RewriteCond. Por último, el archivo "robots.txt". Siempre es una buena idea tener uno, posiblemente emtpy si quiere evitar 404 cuando los robots buscan su sitio.

Como no está cambiando nada en la cadena de consulta, la directiva [QSA] no es necesaria.

Mejoras:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 
RewriteRule ^.*$ index.php [L] 

La primera RewriteRule coincidirá con toda la trayectoria solicitada. Los dos RewriteCond están conectados con [OR], por lo que el primer RewriteCond que devuelve verdadero cancelará la evaluación posterior. El primer RewriteCond prueba si el archivo solicitado existe. Si existe, devuelve verdadero y el proceso vuelve al primer RewriteRule. La expresión objetivo es "-", lo que significa "no reescribir". El [L] detiene el procesamiento posterior de las reglas de reescritura. Así que, al final, para un archivo existente, solo tenemos una prueba de sistema regex y una de archivo, y después de eso, este archivo existente se enviará al navegador.

Si no se encontró ningún archivo, la primera RewriteRule y RewriteCond no se activarán, por lo que [L] no se detendrá el proceso. Entonces, se ejecuta el segundo RewriteRule. Este es incondicional, y la expresión regular es la misma que antes, haciendo coincidir todo y reescribiéndola en "index.php".

Esta reescritura no llamará a su index.php si existe algún archivo, incluyendo /forum/login.php.

Puede cambiar el segundo a RewriteRule ^.*$ index.php/$0 [L] si desea continuar el análisis $_SERVER['PATH_INFO'] en lugar de $_SERVER['REQUEST_URI'].

+0

¡Gracias! He estado buscando este nivel de explicación durante meses. – wallyk

+0

Corrección está funcionando ahora. –

+2

Esto es tan increíblemente minucioso y necesita MUCHO más crédito del que se le ha otorgado. –

2

intento con esto:

RewriteEngine on 
RewriteCond $1 !^(index\.php|forum|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

Y esto:

# BEGIN PunBB 

# ---------------------------------------------------------------------- 
# Start rewrite engine 
# ---------------------------------------------------------------------- 

<IfModule mod_rewrite.c> 
    # MultiViews interfers with proper rewriting 
    Options -MultiViews 

    RewriteEngine On 

    # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly 
    RewriteBase /forum/ 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . rewrite.php [L] 
</IfModule> 


# ---------------------------------------------------------------------- 
# Better website experience for IE users 
# ---------------------------------------------------------------------- 

# Force the latest IE version, in various cases when it may fall back to IE7 mode 
# github.com/rails/rails/commit/123eb25#commitcomment-118920 
# Use ChromeFrame if it's installed for a better experience for the poor IE folk 

<IfModule mod_setenvif.c> 
    <IfModule mod_headers.c> 
     BrowserMatch MSIE ie 
     Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie 
    </IfModule> 
</IfModule> 

<IfModule mod_headers.c> 
    # Because X-UA-Compatible isn't sent to non-IE (to save header bytes), 
    # We need to inform proxies that content changes based on UA 
    Header append Vary User-Agent 
    # Cache control is set only if mod_headers is enabled, so that's unncessary to declare 
</IfModule> 


# ---------------------------------------------------------------------- 
# UTF-8 encoding 
# ---------------------------------------------------------------------- 

# Use UTF-8 encoding for anything served text/plain or text/html 
AddDefaultCharset utf-8 

# Force UTF-8 for a number of file formats 
AddCharset utf-8 .html .css .js .xml .json .rss 


# ---------------------------------------------------------------------- 
# A little more security 
# ---------------------------------------------------------------------- 

# Do we want to advertise the exact version number of Apache we're running? 
# Probably not. 
## This can only be enabled if used in httpd.conf - It will not work in .htaccess 
# ServerTokens Prod 


# "-Indexes" will have Apache block users from browsing folders without a default document 
# Usually you should leave this activated, because you shouldn't allow everybody to surf through 
# every folder on your server (which includes rather private places like CMS system folders). 
<IfModule mod_autoindex.c> 
    Options -Indexes 
</IfModule> 

# END PunBB 
+0

No, todavía se está reduciendo a solo/forum /. –

+0

He editado mi fragmento de código ... inténtelo ahora. –

+0

Todavía no se corta, revisé todos los archivos .htaccess en mi servidor web. –

Cuestiones relacionadas