【问题标题】:CakePHP Plugin - how to setup Apache Rewrite for vanity URLCakePHP 插件 - 如何为虚 URL 设置 Apache Rewrite
【发布时间】:2014-04-27 22:13:24
【问题描述】:

几天来一直在尝试解决这个问题,但没有任何乐趣。这是我的设置:我在

中安装了 CakePHP
/home/user/tools/cakephp

还有一个插件在

/home/user/tools/cakephp/app/Plugin/MyPlugin

Apache 服务器设置是这样的,我已将 DocRoot 设置为 /home/user/tools,因此浏览到

http://myserver.com/cakephp/my_plugin 

工作正常,但现在我的客户想要这样设置

http://myserver.com/product-name

提供 CakePHP 插件,并尊重所有后续路线。有没有人有任何设置这样的经验?不幸的是,必须是 Apache,并且可以通过混合 config/.htaccess(客户端约束)来完成。

谢谢 斯蒂芬

【问题讨论】:

  • 您可以在 routes.php 文件中进行设置 - 查看手册中的路由页面:book.cakephp.org/2.0/en/development/routing.html#plugin-routing
  • 不,我不能。 URL的“product-name”部分与Cake无关,需要Apache配置。
  • 关于你的问题,这似乎微不足道:RewriteRule ^product-name$ /cakephp/my_plugin [L]
  • 所以别名必须在apache级别定义,但是PHP可以用来辅助处理通过apache config/.htaccess定义的值吗?
  • 附言。您的应用程序的其他部分是否正常工作?例如:默认的/pages/display/home url?因为我感觉你的 DocumentRoot 没有正确设置为 production ..

标签: php apache .htaccess cakephp


【解决方案1】:

您是说您必须通过 Apache 配置或 .htaccess 文件执行此操作,为什么?插件可以有他自己的 Config/routes.php 或者您可以在应用程序范围的 app/Config/routes.php 文件中配置路由。我们正在为我们在应用程序中使用的插件做同样的事情。

我们做了什么:

在应用程序范围的路由文件 (app/Config/routes.php) 中,我们设置了一个变量,我们将其用作访问插件的基本 url。我们将它设置在一个变量中,以便在与其他控制器或插件发生冲突时轻松切换,因此我们希望通过执行以下操作来保持这种灵活性:

# 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);

然后我们配置我们的自定义路由:

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'
));

现在我们可以通过 'product-name' url 访问 pugin。

但是,当您只需要一个控制器/动作范围的解决方案时,您可以使用以下两条路线来完成此操作:

Router::connect($MyPluginBase . '/:controller/:action/*', array(
    'plugin'     => 'my_plugin'
));
Router::connect($MyPluginBase . '/*', array(
    'plugin'     => 'my_plugin',
    'controller' => 'my_plugin_main_controller'
));

请注意Router::connect方法matters的顺序!


ps。再次阅读问题后,我看到您将 DocumentRoot 设置为错误的生产。请参阅食谱中的以下页面以进行澄清:http://book.cakephp.org/2.0/en/installation.html#production

【讨论】:

  • 这看起来很有希望,让我试试,我会回复你的。
  • 我找到了解决方法,但这个答案可能是最有帮助的,奖励了赏金。
  • @stephenmc 非常感谢你 :) 你愿意用你的解决方法更新你的问题吗?只是为了让我们和其他有同样问题的人知道你的解决方案。
【解决方案2】:

将以下行添加到 htaccess 文件中应该可以工作

RedirectMatch 301 cake/my_plugin(.*) /product-name$1 

以上将解决:

http://myserver.com/cakephp/my_pluginhttp://myserver.com/product-name

http://myserver.com/cakephp/my_plugin/somelinkhttp://myserver.com/product-name/somelink

【讨论】:

    【解决方案3】:

    当您说“所有后续路线都受到尊重”时,我假设您的意思是 http://myserver.com/product-name/foo/bar 将与 http://myserver.com/cakephp/my_plugin/foo/bar 一样工作。

    如果是这种情况,并且您已经安装了mod_alias,您需要做的就是在httpd.conf 中提供一个Alias 指令:

    Alias /product-name /cakephp/my_plugin
    

    这对 CakePHP 应该是完全透明的;它不会意识到这种映射正在发生。

    如果您想阻止对http://myserver.com/cakephp/...的直接请求,您还可以添加外部重定向:

    Redirect 301 /cakephp/my_plugin /product-name
    

    (来自http://httpd.apache.org/docs/current/mod/mod_alias.html#alias

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多