CakePHP Plugin – comment configurer Apache Rewrite pour une URL personnalisée

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 )