1

我激活了 SEO 友好的 URL。基本上,我的应用程序中的 URL 如下所示: http://x.com/enhttp://x.com/en/gallery.

在我的应用程序中,com_users 上没有链接,比方说。但用户仍然可以使用以下 URL 之一打开它:http://x.com/component/usershttp://x.com/?option=com_banners.

我用这个阻止了第一个:

RewriteCond %{REQUEST_URI} /component/ [NC]
RewriteRule ^.*$ - [F,L]

如何阻止第二个(?option=com_users)?

我知道这种行为可能是 Joomla 的默认行为和预期行为,但我只想给你一个例子。

当我只允许注册用户访问我的所有页面时,他们仍然可以访问组件。同时在 Joomla 管理中没有读取权限。最后,用户将获得模板页面或一些公开数据,例如来自 com_content 的文章。还有问题:在这种情况下如何引发 403 或者至少重定向到 / ?

更新: 我需要阻止 /users?view=registration,重置提醒和配置文件。我需要将任何错误重定向到登录页面。不管是整个 Joomla 组件还是视图、任务等。

4

2 回答 2

1

我编写了自己的插件来处理所有情况,并在出现任何不便时重定向到登录页面(/login)。不便之处是指直接访问 Joomla 中的任何组件,或 403 或 404,但不是 500。目前,我的应用程序运行良好,仅接受以下 URL:/login、/home、/gallery、/gallery/album/任何,以及其他几个。完全禁止直接访问,但用户不能使用 URL 参数(如?option=com_users)或/component/路径。

这种方法不适用于关闭 SEO URL。

<?php // no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.event.plugin' );

class  plgSystemComontrol extends JPlugin {

    function plgSystemComcontrol(& $subject, $config) {
        parent::__construct($subject, $config);
    }

    function onAfterRoute() {
        //  get plugin parameters
        $com_redirect_url = $this->params->def('com_redirect_url', 'index.php?option=com_user&view=login');
        $com_debug = $this->params->def('com_debug', '0');
        $com_message = $this->params->def('com_message', '');

        // get option, view, task ..
        $mainframe = JFactory::getApplication();
        $option = JRequest::getCmd('option');
        $view = JRequest::getCmd('view');
        $task = JRequest::getCmd('task');

        //  get current URL
        $uri = JFactory::getURI();
        $url = $uri->toString();
        $u_host = $uri->getHost();
        $u_path = $uri->getPath();
        $path = substr($url, strlen(JURI::root()));

        // get user permissions
        $groupsUserIsIn = JAccess::getGroupsByUser(JFactory::getUser()->id);
        $user_type = implode(" ",$groupsUserIsIn);
        $group_sum = array_sum($groupsUserIsIn);

        if ($com_debug == '1') {
            $mainframe->enqueueMessage('--------------------------------');
            $mainframe->enqueueMessage('$option = '.$option);
            $mainframe->enqueueMessage('$view = '.$view);
            $mainframe->enqueueMessage('$task = '.$task);
            $mainframe->enqueueMessage('$url = '.$url);
            $mainframe->enqueueMessage('$path = '.$path);
        }

        if (strpos($path, 'administrator') === 0) {
            return;
        }

        // set default redirect page
        $redirectPage = ($group_sum > 1) ? 'index.php' : 'index.php/login';
        $directAccess = strpos($path, 'component') !== false || strpos($path, 'option') !== false;

        // allow login page only
        if ($option == 'com_users') {
            if (($view == 'login' || empty($view) || $task == 'user.login' || $task == 'user.logout') && !$directAccess) { // $view == 'default'
                return;
            } else {
                $mainframe->redirect($redirectPage, $directAccess ? 'Direct access to components forbidden' : 'Login/logout is enabled only');
                //JError::raiseError(403, JText::_('Forbidden'));
                //return;
            }
        }

        // deny direct access to components
        if ($directAccess) {
            $mainframe->redirect($redirectPage, 'Direct access to components forbidden');
            //JError::raiseError(401, JText::_('/component/'));
        }

        // get usertype to see if logged-in
        // $user =& JFactory::getUser();
        // $user_type = $user->get('usertype');
        $groupsUserIsIn = JAccess::getGroupsByUser(JFactory::getUser()->id);
        $user_type = implode(" ",$groupsUserIsIn);
        $group_sum = array_sum($groupsUserIsIn);
        if ($group_sum > '1') {
            return ;
        }

        //if user logged-in, then return from function
        if (empty($option)) {
            return;
        }

        $mainframe->redirect( $com_redirect_url, $com_message );

        return;
    }
}
?>

我希望这将有助于了解如何进行一些自定义重定向并禁用对组件的直接访问。

于 2012-08-31T14:16:20.327 回答
1

我会采用另一种方式,并为此使用 rel=canonical 。

这是一种更容易/更好的做事方式,因为标签将出现在所有“页面版本”上,并且您不需要设置许多特定于案例的规则或携带大量重定向文件......

这只是一个有助于规范化的插件。

http://extensions.joomla.org/extensions/site-management/seo-a-metadata/meta-data/11038?qh=YTo0OntpOjA7czo5OiJjYW5vbmljYWwiO2k6MTtzOjExOiInY2Fub25pY2FsJyI7aToyO3M6MTI6IidjYW5vbmlj30%YWwnLiFub2aToiZO

于 2012-08-15T09:49:50.083 回答