2010-06-08 32 views
6

Estoy usando la siguiente secuencia de comandos htaccess para poder ocultar index.php desde el URI.Reescritura de URL de Codeigniter

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

Pero estoy frente a un importante problema :(

Tengo un directorio llamado assets al lado de mi archivo index.php y debería estar allí. Cuando hojeo el directorio por el navegador, a continuación, CodeIgniter de que no se encuentra página se muestra. no puedo navegar por el archivo /assets/image.jpg pero muestra cuando llamo desde una etiqueta <img>

Qué puedo hacer ahora?

Tenga en cuenta que está funcionando en mi servidor local (localhost) pero no en el servidor activo.

Respuesta

6

Ustedes están pensando en esto.

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^(.*)$ /index.php/$1 [NC,L] 

Eso pasará cualquier solicitud que Apache no cumplirá con CodeIgniter. De esta forma, puede crear directorios sin tener que actualizar sus reglas de reescritura, y no necesita configurar el manejo de 404 en Apache (incluso dentro de sus directorios de imágenes/recursos).

El crédito va para los autores de Zend Framework que recomiendan este bit en su guía del usuario. Esta versión está ligeramente modificada para CodeIgniter.

0

Este es el archivo .htaccess que utilizo para mi CI instalar:

Si lo tienes en una subcarpeta tendrá que editar RewriteBase.

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    #Removes access to the system folder by users. 
    #Additionally this will allow you to create a System.php controller, 
    #previously this would not have been possible. 
    #'system' can be replaced if you have renamed your system folder. 
    RewriteCond %{REQUEST_URI} ^system.* 
    RewriteRule ^(.*)$ /index.php?/$1 [L] 

    #When your application folder isn't in the system folder 
    #This snippet prevents user access to the application folder 
    #Submitted by: Fabdrol 
    #Rename 'application' to your applications folder name. 
    RewriteCond %{REQUEST_URI} ^application.* 
    RewriteRule ^(.*)$ /index.php?/$1 [L] 

    #Checks to see if the user is attempting to access a valid file, 
    #such as an image or css document, if this isn't true it sends the 
    #request to index.php 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
</IfModule> 

<IfModule !mod_rewrite.c> 
    # If we don't have mod_rewrite installed, all 404's 
    # can be sent to index.php, and everything works as normal. 
    # Submitted by: ElliotHaughin 

    ErrorDocument 404 /index.php 
</IfModule> 
+0

¿Quiere decir que todavía no lo ha movido la carpeta del sistema fuera del directorio público? ¿Qué sucede cuando usted (o su administrador) desactiva AllowOverride en caso de accidente? CI tiene abortos desordenados en todos sus archivos, pero ¿ha verificado que sus archivos sean seguros para ser el punto de entrada de un usuario? Es más fácil simplemente mover la carpeta del sistema al padre y tener un directorio público separado. – coreyward

+0

Sí, eso es cierto y moví la carpeta de mi sistema en mi servidor de producción. –

0

Aquí es una solución completa, que estoy usando y me encontré trabajando muy bien:

Coloque este fragmento de código a continuación en el archivo .htaccess en la raíz de su proyecto como http://localhost/myProject

RewriteEngine On 
RewriteBase /appDirName 
RewriteCond %{REQUEST_URI} ^appDirName.* 
RewriteRule ^(.*)$ /index.php/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 

Y a su CI archivo de configuración ubicado en system \ application \ config \ config.php

$config['uri_protocol'] = "REQUEST_URI"; 
0
# Turn on URL rewriting 
RewriteEngine On 
# Put your installation directory here: 
RewriteBase/
# Allow these directories and files to be displayed directly: 
# - index.php (DO NOT FORGET THIS!) 
# - robots.txt 
# - favicon.ico 
# - Any file inside of the images/, js/, or css/ directories 
RewriteCond $1 ^(index\.php|robots\.txt|favicon\.ico|images|js|css) 
# No rewriting 
RewriteRule ^(.*)$ - [PT,L] 
# Rewrite all other URLs to index.php/URL 
RewriteRule ^(.*)$ index.php/$1 [PT,L] 

utilizo esto y que funcione a la perfección!

0

Inserte el siguiente en su .htaccess

# Change "welcome" to your default controller: 
    RewriteRule ^(welcome(/index)?|index(\.php)?)/?$/[L,R=301] 
    RewriteRule ^(.*)/index/$ $1 [L,R=301] 

# Checks to see if the user is attempting to access a valid file, 
# if not send them to index.php 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php/$1 [L] 
Cuestiones relacionadas