2010-06-28 10 views
10

Estoy usando un archivo .htaccess para dirigir las solicitudes de un directorio a un archivo php personalizado que proporcione información sobre ese directorio (y quiero que la URL que muestra el navegador no cambie).mod_rewrite: agregar una barra al final?

Aquí está la parte relevante del archivo .htaccess.

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

Esto funciona bien si vas a un directorio e incluyen una barra final:

http://domain.com/path/ 

Pero sin la barra final, no

http://domain.com/path 

hace la dirección URL (mostrado en el navegador) se convierte en:

http://localhost:8888/path/?url=/path 

He intentado fijar esto añadiendo una regla por encima de esta regla:

RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

Pero eso no funciona para mí.

¿Cómo puedo obtener .htaccess para agregar la barra al final si se omite y luego actuar como si hubiera estado allí?

Gracias

Actualización: a lo solicitado, aquí es todo el asunto.

<IfModule mod_rewrite.c> 
RewriteEngine On 

#force trailing slashes on real directories 
RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

</IfModule> 
+0

Con base en el comportamiento que describes Creo que hay algo malo en otra parte de su archivo '.htaccess', ¿le importaría publicar todo? –

Respuesta

8

suspiro.

Esta línea:

RewriteCond %{REQUEST_FILENAME} -D 

debería haber sido:

RewriteCond %{REQUEST_FILENAME} -d 
0

¿Se refiere a

RewriteRule ^(.*)$ $1/ [L] 

en su lugar?

No conozco su enfoque. Me gustaría probar algo así como

RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

He usado esto para volver a escribir antes y funciona:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^domain\.com 
RewriteRule ^(.*)$ http://www.domain.com$1 
RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

Tenga en cuenta que no he incluido la barra al final de la primera regla.

Además, le aconsejo que no confíe en .htaccess a menos que sea absolutamente necesario. Esto se debe a que el servidor verificará constantemente los archivos .htaccess. Usar el archivo httpd.conf significa que apache solo cargará las condiciones y las reglas una vez. Al menos me aconsejaron que lo hiciera debido a esto.

+0

Tienes razón, ¿debería haber sido un *, no un? Se corrigió eso en la pregunta. Intenté usar tu sugerencia, pero tengo el mismo efecto. Para que quede claro en la versión en mi pregunta y en la versión, la redirección irá al lugar correcto. El problema es el texto que muestra el navegador. No quiero que el usuario vea la cadena de consulta. Solo quiero que vean la ruta al directorio, con una barra inclinada. – bkit

+0

¿Intentó agregar el código solo en el archivo httpd.conf en lugar del archivo .htaccess? Puede guardarlo en un archivo independiente httpd-extra.conf y luego usar el comando include al final de su archivo httpd.conf. Utilicé este código para lograr exactamente lo que deseaba, para poder proporcionar direcciones URL más amigables para el usuario. La última línea debería proporcionar eso: reescribe (internamente)/ruta como /myphp.php?url=path, por lo que su navegador solo muestra el primero. Espero que ayude. – misterte

0

probar esto. Agregará una barra inclinada final a las solicitudes de directorio que no tienen una barra diagonal.

<IfModule mod_rewrite.c> 
RewriteEngine On 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*?)/?$ /myphp.php?url=$1/ [QSA,L] 

</IfModule> 
4

no se moleste con Mod Rewrite, existe una directiva para que

<Location /some/path> 
    DirectorySlash On 
    SetHandler some-handler 
</Location> 

http://httpd.apache.org/docs/2.2/mod/mod_dir.html

+0

'DirectorySlash Off' hace lo contrario, deshabilita la adición de barras automáticas mod_dir cuando el recurso de solicitud es un directorio. El valor predeterminado es activado. Por qué no funciona para el OP es desconocido, tal vez mod_dir no está cargado – higuita

Cuestiones relacionadas