Versión móvil renderizada por un archivo PHP diferente que conserva URL amigables
Frecuentes
Visto 166 veces
1
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?
1 Respuestas
2
"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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas .htaccess url-rewriting friendly-url or haz tu propia pregunta.
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