Nous essayons maintenant de comprendre cela depuis quelques jours sans joie. Voici ma configuration: J’ai une installation CakePHP dans
/home/user/tools/cakephp
et un plugin à
/home/user/tools/cakephp/app/Plugin/MyPlugin
La configuration du serveur Apache est telle que je mets DocRoot sur / home / user / tools, afin de naviguer jusqu’à
http://myserver.com/cakephp/my_plugin
fonctionne bien, mais maintenant mon client veut le configurer pour que
http://myserver.com/product-name
sert le plug-in CakePHP, et toutes les routes suivantes sont honorées. Quelqu’un a-t-il déjà expérimenté quelque chose comme ça? Doit être Apache, malheureusement, et peut être fait avec un mélange de config / .htaccess (contraintes clients).
Merci Stephen
Vous dites que vous devez le faire via la configuration Apache ou un fichier .htaccess, pourquoi? Un plugin peut avoir son propre fichier Config / routes.php ou vous pouvez configurer le routage dans votre fichier app / config / routes.php. Nous faisons la même chose pour un plugin que nous utilisons dans notre application.
Ce que nous avons fait:
Dans le fichier des routes larges de l’application (app / Config / routes.php), nous définissons une variable que nous utilisons comme URL de base pour accéder au plug-in. Nous la définissons dans une variable afin que nous puissions facilement basculer lorsque nous rencontrons des conflits avec d’autres contrôleurs ou plug-ins. Nous souhaitons donc conserver cette flexibilité en procédant comme suit:
# set the webroot for the plugin, for ajax calls and the sake of usability $MyPluginBase = '/product-name'; # And we have this set just in case we need it somewhere in our application Configure::write('MyPlugin.base', $MyPluginBase);
Ensuite, nous configurons nos itinéraires personnalisés:
Router::connect($MyPluginBase . '/:name', array( 'plugin' => 'my_plugin', 'controller' => 'my_plugin_products', 'action' => 'products' )); Router::connect($MyPluginBase . '/some/other/url/*', array( 'plugin' => 'my_plugin', 'controller' => 'my_plugin_some_controller', 'action' => 'whatever' ));
Maintenant, nous pouvons accéder au fichier via l’URL “nom-produit”.
Mais lorsque vous avez simplement besoin d’une solution contrôleur / action pour cela, vous pouvez y parvenir en utilisant les deux routes suivantes:
Router::connect($MyPluginBase . '/:controller/:action/*', array( 'plugin' => 'my_plugin' )); Router::connect($MyPluginBase . '/*', array( 'plugin' => 'my_plugin', 'controller' => 'my_plugin_main_controller' ));
S’il vous plaît noter que l’ordre de routeur :: méthodes de connexion compte !
ps. Après avoir relu la question, vous avez constaté que votre DocumentRoot était incorrect pour la production. Consultez la page suivante du livre de recettes pour plus de précisions: http://book.cakephp.org/2.0/en/installation.html#production
L’ajout de la ligne suivante au fichier htaccess devrait fonctionner
RedirectMatch 301 cake/my_plugin(.*) /product-name$1
Ce qui précède résoudrait:
http://myserver.com/cakephp/my_plugin
à http://myserver.com/product-name
http://myserver.com/cakephp/my_plugin/somelink
à http://myserver.com/product-name/somelink
Quand vous dites “toutes les routes suivantes sont honorées”, je suppose que vous voulez dire que http://myserver.com/product-name/foo/bar fonctionnera comme http://myserver.com/cakephp/my_plugin/foo/ bar .
Si c’est le cas et que mod_alias
installé, il vous suffit de fournir une directive Alias
dans httpd.conf
:
Alias /product-name /cakephp/my_plugin
Cela devrait être complètement transparent pour CakePHP; il ne sera pas au courant que cette cartographie est en cours.
Si vous voulez empêcher les requêtes directes sur http://myserver.com/cakephp/ …, vous pouvez également append une redirection externe:
Redirect 301 /cakephp/my_plugin /product-name
(de http://httpd.apache.org/docs/current/mod/mod_alias.html#alias )