Versión móvil renderizada por un archivo PHP diferente que conserva URL amigables

Tengo un sitio web sobre libros. Actualmente, ya tiene algunas reglas de reescritura de URL en mi archivo .htaccess, por lo que dichas URL son más amigables:

http://www.example.com/book.php?book=xxx -> http://www.example.com/book/xxx.html

La regla para eso:

RewriteRule ^libro/([^/]+).html$ libro.php?libro=$1 [QSA,L]

Ahora estoy desarrollando una versión móvil exclusivamente para la sección de libros, eso significa que index.php y todas las demás páginas siguen siendo las mismas. Entonces, me gustaría tener URL como esta (cuando el agente de usuario se detecta como un dispositivo móvil):

http://www.example.com/mobile/m_book.php?book=xxx -> http://m.example.com/book/xxx.html

Mi solución actual (eso no funciona), reescribe la URL correctamente, pero luego el servidor no encuentra el PHP para mostrar la página y recibo un "Servidor no encontrado" en el navegador. El archivo PHP para mostrar la página del libro normal es book.php, pero el archivo PHP responsable de mostrar solo en dispositivos móviles está en una subcarpeta y se puede encontrar en: mobile/m_book.php

RewriteEngine On

#To detect mobile browsers
RewriteCond %{HTTP_USER_AGENT} android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\ )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\ )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\ )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\ )|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-) [NC]
#To avoid loops
RewriteCond %{HTTP_HOST} !^m\.example\.com$ [NC]
#First Rewrite Rule
RewriteRule ^book/([^/]+)\.html$ http://m.example.com/m_book.php?book=$1 [QSA,L,R]

#Only the mobile request should be rendered by mobile/m_book.php
RewriteCond %{HTTP_HOST} ^m\.example\.com$ [NC]
RewriteRule ^book/([^/]+)\.html$ mobile/m_book.php?book=$1 [QSA,L,R]

#Otherwise (the already predefined rule)
RewriteRule ^book/([^/]+)\.html$ book.php?book=$1 [QSA,L]

¿Qué tiene de malo este fragmento de código?

preguntado el 28 de agosto de 12 a las 14:08

1 Respuestas

"Servidor no encontrado" es extraño, esperaría "Página no encontrada". Está utilizando una redirección externa [R] para http://m.example.com/m_book.php?book=$1 cuando el agente de usuario es un navegador móvil. Si te entiendo bien, la página /m_book.php no existe, solo existen /book.php y /mobile/m_book.php.

Entonces, después de redirigir a http://m.example.com/m_book.php?book=$1, no se aplican otras reglas, esa es su página final (y no existente). ¿No deberías preferir usar

#First Rewrite Rule
RewriteRule ^book/([^/]+)\.html$ http://m.example.com/mobile/m_book.php?book=$1 [QSA,L,R]

que llega a la página correcta y debería funcionar pero se ve feo en el navegador.

O, si desea que la URL se vea bien

#First Rewrite Rule
RewriteRule ^book/([^/]+)\.html$ http://m.example.com/book/$1.html [QSA,L,R]

que redirige, pero luego tu siguiente regla

#Only the mobile request should be rendered by mobile/m_book.php
RewriteCond %{HTTP_HOST} ^m\.example\.com$ [NC]
RewriteRule ^book/([^/]+)\.html$ mobile/m_book.php?book=$1 [QSA,L,R]

tiene la condición correcta, así como la regla de coincidencia y hace lo que se espera.

Esto es teoría, no lo he probado. Y, por cierto, no creo que necesite el indicador [QSA] que hace que las cadenas de consulta se combinen porque efectivamente excluye las cadenas de consulta.

Respondido 28 ago 12, 16:08

Todavía tengo "Servidor no encontrado"... Redirige correctamente a m.ejemplo.com/libro/nombre-del-libro.html ¡pero luego aparece "Servidor no encontrado"! =/ - RLC

Solo para estar seguro: si llama al subdominio directamente, ¿la página se muestra correctamente? - Olaf

Sí. Cuando accedo a example.com/mobile/m_book.php, se muestra correctamente. Pero m.example.com/mobile/m_book.php no funciona - RLC

Nuevamente, ¿el SUBdominio se representa correctamente? Si llama a m.example.com, debería funcionar; de lo contrario, no es un reorientar problema sino un problema de dominio. ¿El subdominio m apunta correctamente a su espacio web? - Olaf

Entonces creo que es un problema de subdominio. Cuando llamo a m.example.com no funciona. - RLC

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.