La redirección Isapi Rewrite 301 se resuelve como 404 - ¿referencia circular?
-
20-08-2019 - |
Pregunta
Estoy tratando de usar IIS Isapi Rewrite para hacer lo siguiente ...
Necesito que las URL seo-amigables se conviertan (silenciosamente) nuevamente en URL amigables para la aplicación de esta manera:
RewriteRule ^/seo-friendly-url/ /test/index.cfm [I,L]
Suficientemente simple.
Pero también necesito que las URL ya indexadas en los motores de búsqueda (por ejemplo) se redirijan 301 a la versión amigable para SEO. Me gusta así:
RewriteRule ^/test/index.cfm /seo-friendly-url/ [I,R=301]
Cada uno de estos funciona bien de forma aislada. Pero cuando tengo ambos en mi archivo .ini termino con / seo-friendly-url / que aparece en la barra de direcciones de mi navegador, pero me aparece un 404. (¡Sí, /test/index.cfm definitivamente existe!)
Sé que parece una referencia circular, pero la primera regla solo reescribe la URL entre IIS y la aplicación; no hay redirección, por lo que no voy a presionar Isapi Rewrite por segunda vez. ¿O me equivoco al respecto?
He habilitado el inicio de sesión en Isapi Rewrite y veo lo siguiente:
HttpFilterProc SF_NOTIFY_PREPROC_HEADERS
DoRewrites
New Url: '/seo-friendly-url/'
ApplyRules (depth=0)
Rule 1 : 1
Result (length 15): /test/index.cfm
ApplyRules (depth=1)
Rule 1 : -1
Rule 2 : 1
Result (length 18): /seo-friendly-url/
ApplyRules: returning 301
ApplyRules: returning 1
Rewrite Url to: '/seo-friendly-url/'
¿Alguien tiene alguna idea?
Solución 2
A través de alguna prueba y error, he encontrado una solución para esto.
Especifique que la coincidencia de redireccionamiento se encuentra al final de la cadena con el símbolo $:
RewriteRule ^/test/index.cfm$ /seo-friendly-url/ [I,R=301]
Haga que la URL reescrita sea trivialmente diferente de la cadena de coincidencia de redireccionamiento; en este caso, agregue un "? " ;:
innecesarioRewriteRule ^/seo-friendly-url/ /test/index.cfm? [I,L]
Otros consejos
Aquí tiene dos reescrituras diferentes y debería funcionar si lo hace correctamente
-
El primero nunca es visto por el agente de usuario del cliente. Solicita / seo-friendly y lo reescribe internamente y responde
-
El segundo no es realmente una reescritura, sino una redirección. Envías eso al cliente y vuelve a solicitar el / seo-friendly. Creo que necesitas usar [R = 301, L] para decir que este es el final de la línea, solo devuélvelo (L lo hace eso)