2010-04-22 10 views
5

que acaba de configurar un subdominio con el siguiente RewriteCond:¿Cómo obtengo que apache RewriteRule funcione correctamente para un subdominio?

RewriteCond $1 !^search.php$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 

estoy usando las mismas condiciones de reescritura en mi dominio principal y funciona perfectamente. Sin embargo, cuando lo configuro en el subdominio, simplemente emite "index.php" al ir a http://sub.domain.com

Cada página en el subdominio genera el nombre de la página en el cuerpo en lugar de procesar el código, excepto en la página de búsqueda , que parece estar funcionando correctamente.

¿Qué puedo hacer para corregir este problema?

+0

¿Hiciste algo especial para los dominios comodín? (además de "ServerAlias ​​* .example.com" en httpd.conf). – Kdeveloper

Respuesta

0

Varias cosas vienen a la mente aquí:

tengo unas pocas sugerencias/comentarios/trampas. Esperemos que uno de ellos es útil para usted:

  1. Asegúrese search.php no sólo se hace eco de sus $_GET parámetros. Si bien esto parece obvio en retrospectiva, es una de las soluciones más pasadas por alto.
  2. RewriteRule funciona de forma ligeramente diferente cuando lo especifica en un archivo de configuración del servidor que si lo especifica en un .htaccess. Específicamente, ^/ está mal en una versión de configuración del servidor ya que se usa toda la URL (http://sub.domain.com/blah).
  3. Asegúrese de que no se procesen otras reglas de reescritura para este subdominio primero, ya sea en el httpd.conf/apache2.conf principal o .htaccess.
  4. Asegúrese de que RewriteEngine On aparezca en su configuración, ya que está activado por VirtualHost.
  5. El indicador NS ignorará los redireccionamientos hechos utilizando un relativo Redirect o relativo RewriteRule.
+0

'^ /' Funciona perfecto, el dominio completo ** no ** se usa. Solo el camino –

+0

Además, si RewriteEngine está activado en el archivo .htaccess, asegúrese de que AllowOverride tenga el valor adecuado. –

0

Parece que el patrón '^ /? ([^ /] +) $' Puede no coincidir en absoluto.

Activaría RewriteLog, gire RewriteLogLevel hasta el nivel 3 o superior, y vea si su patrón coincide. De lo contrario, comience con un patrón más simple y luego avance hacia un patrón más complejo.

O, algo más coincide con el patrón, por lo que la solicitud nunca llega a 'RewriteRule^/? ([^ /] +) $' En absoluto. Verás esto en RewriteLog.

Creo que recientemente tuve un problema donde '^ /' no coincidía en ciertos casos en un host virtual. Pero '/' funcionó. La gente de #httpd en Freenode.org me ayudó. Si puedo encontrar esto en mis notas, lo publicaré aquí.

1

No he jugado con tu expresión regular exacta con mod_rewrite, pero si estuviera buscando escribir esa expresión regular en otro motor, tendría que escapar de la barra. Además, dado que $ se usa para indicar una referencia de respaldo, ¿sería necesario que también se escape (sus símbolos $ en la expresión regular serían necesarios ya que es probable que haya más texto en el URI y no coincidan al final de una cadena?)?

me gustaría probar

RewriteCond $1 !^search.php$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^\/]+)$ search.php?q=$1 [L,NS] 

Una otra cosa. Normalmente $ al final de una expresión regular significa "solo coincidencia si este es el final de la cadena". Entonces a partir de eso, si RewriteCond coincide en^búsqueda.php $ pero la URL es search.php? q = ... entonces creo que esto no coincidiría porque search.php no es el final de la cadena. De modo que se vería así (suponiendo que no necesita, necesita cambiar algo más de su original).

RewriteCond $1 !^search.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/?([^/]+)$ search.php?q=$1 [L,NS] 
1

En la configuración principal de la ruta siempre comienza con/y necesita una ruta absoluta:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !^search.php$                                            
RewriteCond %{REQUEST_FILENAME} !-f                                              
RewriteRule ^/([^/]+)$ %{DOCUMENT_ROOT}/search.php?q=$1 [L] 

En un .htaccess necesita un RewriteBase que se extrae del url (sin/en el Regla ahora) y el camino es relativo.

RewriteEngine On 
RewriteBase/                                                   
RewriteCond %{REQUEST_FILENAME} !^search.php$                                            
RewriteCond %{REQUEST_FILENAME} !-f                                              
RewriteRule ^([^/]+)$ search.php?q=$1 [L] 
Cuestiones relacionadas