Ho scoperto un problema con la logica di routing Magento e vorrei vedere se qualcuno può confermarlo.Utilizzo dello stesso nome di instradamento di Magento per i router frontend e admin
Magento impila i router admin, standard, quindi predefinito e li elabora uno alla volta. Magento ottiene il nome del modulo corrente in base all'URL (vedi Mage_Core_Controller_Varien_Router_Standard::match())
, quindi controlla se il modulo deve essere gestito da questo router, in base a una corrispondenza con un nome nella configurazione Magento. Se viene trovata una corrispondenza, la instrada. , continua al router successivo
Config estratto:.
<admin> <routers> <myroute> <use>admin</use> <args> <module>MyNamespace_MyModule</module> <frontName>myroute</frontName> </args> </myroute> </routers> </admin> <frontend> <routers> <myroute> <use>admin</use> <args> <module>MyNamespace_MyModule</module> <frontName>myroute</frontName> </args> </myroute> </routers> </frontend>
Questo significa che se si utilizza lo stesso nome per il router frontend come router admin, il router di amministrazione sarà sempre abbinato prima, anche su frontend page. La tua pagina di frontend ora verrà instradata come se fosse una pagina di amministrazione, utilizzando l'amministratore base_url
, che potrebbe essere diverso dall'URL del tuo negozio causando un reindirizzamento danneggiato
Si noti che questo problema non è evidente nelle istanze di Magento in cui l'URL della base di amministrazione è uguale all'URL di base del frontend.
Qualcuno può confermare che la mia valutazione della logica del router è corretta qui?
Non riesco a parlare con il tuo problema specifico (non sono sicuro di seguirlo interamente) ma il routing in Magento ha iniziato a riflettere sull'idea di 1. Usando un nome personalizzato per i moduli frontend; 2. Usando il nome "admin" per i moduli admin e usando il tag "modules" per aggiungere i controller ai controller che il router admin cercherà. Se ti allontani da questo schema, avrai dolori. –
Ho trovato questo problema in un modulo di terze parti. Ha usato lo stesso nome per il frontend e le aree di amministrazione. Sembra una cosa ragionevole aspettarsi di funzionare, con la differenza che è la stringa "admin" nell'URL che carica l'archivio dell'amministratore. Il problema era che la pagina di frontend finiva per essere caricata dal router admin, causando l'uso dell'URL della base di amministrazione che era diverso dall'URL di base del frontend. Entrambi i router sembrano funzionare come previsto sulla configurazione ad eccezione di questo conflitto di denominazione. – kirkmadera
Guardando oltre mi rendo conto che il modulo non funzionava come avevo pensato. Stava impostando il proprio frontname completamente fuori dall'amministratore. L'amministratore sembrava lo stesso perché i controller del modulo estendevano Mage_Adminhtml_Controller_Action, il cui preDispatch costringe il design alla progettazione dell'amministratore. Hai ragione nel fatto che tutti i controller admin devono scorrere attraverso il nome utente "admin" usando il nodo "modules" per sovrascrivere. Questo modulo di terze parti è impostato in modo errato. Ancora, non ovvio comportamento da Magento – kirkmadera