我激活了SEO友好网址。基本上我的应用程序中的URL如下所示:
http://x.com/en
或http://x.com/en/gallery
。
从我的应用程序中可以看出,在com_users上没有链接。但是,用户仍然可以使用以下网址之一打开它:http://x.com/component/users
或http://x.com/?option=com_banners
。
我用这个阻止了第一个:
RewriteCond %{REQUEST_URI} /component/ [NC]
RewriteRule ^.*$ - [F,L]
如何阻止第二个(?option = com_users)?
我知道这种行为可能是Joomla的默认和预期行为,但我只是想举个例子。
当我仅允许注册用户访问我的所有页面时,他们仍然可以访问组件。在Joomla管理的同时,没有阅读许可。最后,用户正在获取模板页面或某些数据(如果它是公开的),例如来自com_content的文章。问题: 如何在这种情况下筹集403,或者至少重定向到/?
更新 我需要阻止/用户?view = registration,reset remind和profile。我需要将任何错误重定向到登录页面。无论是整个Joomla组件还是视图,任务等都无关紧要。
答案 0 :(得分:1)
我会采取另一种方式,并使用rel = canonical。
这是一种更简单/更好的处理方式,因为标记将显示在所有“页面版本”上,您不需要设置许多特定于案例的规则或随身携带升沉重定向文件...... < / p>
这只是一个有助于你的canoniczlization的插件。
答案 1 :(得分:1)
我编写了自己的插件来处理所有案例,并在遇到任何不便的情况下重定向到登录页面(/ login)。由于不便,我的意思是任何直接访问Joomla中的任何组件,或403或404,但不是500.现在,我的应用程序非常好地接受以下URL:/ login,/ home,/ gallery,/ gallery / album /任何,其他很少。但是,完全禁止直接访问,用户不能使用URL参数(如?option=com_users
)或/component/
路径。
这种方法不适用于关闭SEO网址。
<?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;
}
}
?>
我希望这有助于了解如何进行一些自定义重定向并禁用对组件的直接访问。