2011-11-08 24 views
5

He cavado alto y bajo en Google y StackOverflow para tratar de resolver mi problema, probando innumerables soluciones, pero nada ha funcionado por completo.htaccess Silencio Redirigir a Subdirectorio: Subdirectorio que muestra cuando no se arrastra '/'

Estoy buscando mover la raíz web del dominio principal en mi servidor a un subdirectorio. Lo que tengo actualmente para una ruta del servidor a raíz de la web:

/home/user/public_html/MyWebFilesHere 

Lo que estoy tratando de tener:

/home/user/public_html/subdir/MyWebfilesHere 

Cuando hojeo a mydomain.com, no debería haber ninguna diferencia visible aunque (es decir, "subdir" no visible después de la redirección).

Lamentablemente, estoy restringido a hacer esto puramente con un archivo .htaccess ya que estoy en alojamiento compartido y no tengo acceso a los archivos de configuración de Apache y tal. :(

Lo que tengo actualmente en mi .htaccess en public_html es:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ 
RewriteCond %{REQUEST_URI} !^/subdir/ 
RewriteRule ^(.*)$ /subdir/$1 [L] 

Esto vuelve a dirigir con éxito todas las consultas a la sub-directorio, sin embargo hay un problema muy raro Si voy a

.
mydomain.com/Contact/ 

funciona muy bien, la reorientación de la consulta a la ruta/subdirectorio/Contacto/pero dejando la barra de direcciones solo. Si voy a

mydomain.com/Contact 

(Tenga en cuenta la falta de un terminador '/'), sin embargo, lo que se muestra en la barra de direcciones es

mydomain.com/subdir/Contact/ 

que no es lo que quiero ya "subdirectorio" está mostrando.

Para un ejemplo de trabajo en mi sitio real, prueba a navegar a

colincwilliams.com/Contact/ 

en comparación con

colincwilliams.com/Contact 

¿Ustedes tienen alguna idea sobre cómo hacer este trabajo en silencio, con y sin ¿barra diagonal?

Respuesta

7

Esto probablemente está sucediendo porque mod_dir (el módulo que redirige automáticamente el navegador si una solicitud de un directorio no tiene una barra al mismo con una barra inclinada.Ver el DirectorySlash directive in mod_dir

Lo que sucede es:

  1. usted solicita: mydomain.com/Contact
  2. mod_dir no toca este puesto /Contact no es un directorio
  3. /Contact consigue reescrito para /subdir/Contact y internamente redirigida
  4. mod_dir ve que /subdir/Contact es un directorio y falta el seguimiento barra para redirecciona el navegador a mydomain.com/subdir/Contact/
  5. Así que ahora, la barra de ubicación de su navegador tiene el/subdir/en él.

Puede agregar DirectorySlash off en su .htaccess para desactivar mod_dir de la redirección. Pero si desea que los directorios tengan barras diagonales, puede agregar una condición separada para ello. Sobre la base de lo que ya tiene, podemos ampliarlo a esto:

RewriteEngine on 

# Has a trailing slash, don't append one when rewriting 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ 
RewriteCond %{REQUEST_URI} !^/subdir/ 
RewriteCond %{THE_REQUEST} ./\ HTTP/1\.[01]$ [OR] 
# OR if it's a file that ends with one of these extensions 
RewriteCond %{REQUEST_URI} \.(php|html?|jpg|gif|css)$ 
RewriteRule ^(.*)$ /subdir/$1 [L] 

# Missing trailing slash, append one 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ 
RewriteCond %{REQUEST_URI} !^/subdir/ 
RewriteCond %{THE_REQUEST} [^/]\ HTTP/1\.[01]$ 
# But only if it's not a file that ends with one of these extensions 
RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif|css)$ 
RewriteRule ^(.*)$ /subdir/$1/ [L] 

Nota: He cambiado !^/mydomain/ a !^/subdir/, pensó que era un error porque sin ella, mod_rewrite haría bucle interno indefinidamente (foo ->/subdirectorio/foo ->/subdir/subdir/foo ->/subdir/subdir/subdir/foo, etc). Si lo entendí mal, puedes cambiarlo de nuevo.

Editar: Vea mis adiciones de RewriteCond que coinciden con \.(php|html?|jpg|gif|css). Estas son las extensiones de archivo que se pasan sin que se agreguen barras diagonales. Puede agregar/eliminar para satisfacer sus necesidades.

+0

Jon Lin, su respuesta fue muy servicial y hizo una tonelada de sentido. ¡Gracias! Funcionó (la segunda sugerencia es agregar la barra al final), excepto que ahora ha roto mis enlaces CSS por alguna razón. Están formateados como "/CSS/core-style.css" pero están devolviendo un 404. –

+0

Después de un toque de investigación, parece que los enlaces CSS están pasando por alto el archivo htaccess; "/ CSS/..." está buscando directamente en el directorio public_html para CSS/en lugar de entrar en subdir. –

+0

Ah, se olvidó de que necesita excluir los archivos del final "/" cosas. Ver mi edición –

0

La respuesta de Jon Lin fue muy útil para determinar qué causaba el problema en mi configuración muy similar. Para completar voy a incluir la información relevante de su respuesta:

Esto probablemente sucede porque mod_dir (el módulo que redirige automáticamente el navegador si una solicitud de un directorio no se encuentra una barra al final del mismo con un arrastre Ver reducir la DirectorySlash directive in mod_dir

lo que sucede es:.

  1. usted solicita: mydomain.com/Contact
  2. mod_dir no toca este puesto /Contact no es un directorio
  3. /Contact consigue reescrito para /subdir/Contact e internamente redirigidos
  4. mod_dir ve que /subdir/Contact es un directorio y falta la barra final por lo que redirige el navegador a mydomain.com/subdir/Contact/
  5. Así que ahora, la barra de direcciones del navegador tiene el/subdir/en él.

En mi caso, tuve solicitudes se redirigen a /subdir con algunas excepciones y no quieren tener que volver a habilitar DirectorySlash para cada una de esas excepciones.

Al permitir RewriteEngine para continuar después de la redirección inicial a /subdir, es posible imitar lo mod_dir estaría haciendo sin dejar de tener en cuenta /subdir, antes mod_dir puede verla.

RewriteEngine on 

RewriteCond %{REQUEST_URI} !^/exception1|exception2|... 
RewriteRule ^(.*)$ /subdir/$1 

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

Nota: Es posible que tenga que tener cuidado con lo que RewriteEngine continuar si hay más reglas. No coincidir con la segunda regla continuará con cualquier otra regla que pueda producir un resultado diferente.

Esto se puede evitar mediante el uso de una tercera regla para detener el procesamiento RewriteEngine si la redirección en /subdir ha sucedido:

RewriteCond %{REQUEST_URI} ^subdir 
RewriteRule .* - [L] 
Cuestiones relacionadas