跳转到主要内容

使用类似于内容的链接管理内部或外部URL的重定向

项目描述

使用类似于内容的链接管理内部或外部URL的重定向。在Products.redirectiontool或plone.app.redirector仅处理门户内部的重定向时,collective.redirect允许重定向到外部URL。重定向路径的管理使用重定向内容类型的实例。重定向的路径与重定向实例的路径独立,有以下几个原因。

首先,由于门户对象不是一个基于BTree的文件夹,如果添加太多对象,它将开始表现不佳。允许重定向路径独立于重定向实例的位置,可以在门户根目录中放置很多重定向而不放置太多对象。

其次,路径独立于重定向实例位置,允许用户为无法添加内容的路径创建重定向。请注意,这可能会对您的网站造成负面影响,并且很可能会被滥用于某种形式的拒绝服务攻击。

如果存在针对同一路径的多个重定向,则将优先选择发布日期较近的那个。最后,重定向永远不会覆盖可访问的URL。换句话说,重定向不能覆盖实际的内容对象、皮肤对象、视图或其他可访问项。重定向仅在会引发NotFound错误的情况下才会发生。

请使用浏览器。

>>> from Products.Five import testbrowser
>>> browser = testbrowser.Browser()
>>> portal.error_log._ignored_exceptions = ()
>>> portal_url = portal.absolute_url()

在添加重定向之前,访问不存在的URL将返回404页面。

>>> browser.open(portal_url+'/foo')
Traceback (most recent call last):
HTTPError: HTTP Error 404: Not Found
>>> browser.open(portal_url+'/bar')
Traceback (most recent call last):
HTTPError: HTTP Error 404: Not Found

打开另一个浏览器,并以可以添加重定向的用户身份登录。

>>> from Products.PloneTestCase import ptc
>>> member_browser = testbrowser.Browser()
>>> member_browser.handleErrors = False
>>> member_browser.open(portal.absolute_url())
>>> member_browser.getLink('Log in').click()
>>> member_browser.getControl(
...     'Login Name').value = ptc.default_user
>>> member_browser.getControl(
...     'Password').value = ptc.default_password
>>> member_browser.getControl('Log in').click()
>>> member_browser.open(portal_url+'/Members/test_user_1_')

添加重定向。将“本地路径”字段设置为要重定向的路径。本地路径始终以门户为根。将“URL”字段设置为要重定向到的URL。

>>> member_browser.getLink(url='createObject?type_name=Redirect').click()
>>> member_browser.getControl('Title').value = 'Foo Redirect Title'
>>> member_browser.getControl('Local Path').value = '/foo'
>>> member_browser.getControl('URL').value = '/plone/events'
>>> member_browser.getControl('Save').click()
>>> print member_browser.contents
<...
...Changes saved...
...Foo Redirect Title...
...Local Path...
.../foo...
...URL...
.../events...

当重定向对访问本地路径的用户不可用时,例如当重定向的工作流禁止时,将不会发生重定向。

>>> foo_redirect = portal.Members.test_user_1_['foo-redirect-title']
>>> portal.portal_workflow.getInfoFor(
...     foo_redirect, 'review_state')
'private'
>>> browser.open(portal_url+'/foo')
Traceback (most recent call last):
HTTPError: HTTP Error 404: Not Found

一旦重定向可访问,访问本地路径的用户将被重定向到远程URL。

>>> self.loginAsPortalOwner()
>>> portal.portal_workflow.doActionFor(foo_redirect, 'publish')
>>> self.logout()

使用VHM风格的URL来模拟虚拟托管环境。

>>> browser.open('http://nohost/VirtualHostBase/http/nohost'
...              '/VirtualHostRoot/plone/foo/')
>>> browser.url
'http://nohost/plone/events'

没有重定向的本地路径仍会返回404页面。

>>> browser.open(portal_url+'/bar')
Traceback (most recent call last):
HTTPError: HTTP Error 404: Not Found

变更日志

0.5 - 2010-11-10

  • 具有两个或更多不存在段落的本地路径不起作用,因为遍历在第一个不存在段落下停止,然后request.URL将返回此截断的路径,因此查询目录时不会产生匹配项。已将视图更改为使用ACTUAL_URL,它确实会返回实际使用的URL。

0.4 - 2009-06-03

  • 回退到plone的标准_error_message被AQ包裹在plone_templates皮肤文件夹中,因此忽略了皮肤优先级,例如,不允许覆盖default_error_message。

0.3 - 2008-11-14

  • 添加对VHM的支持

0.2 - 2008-11-12

  • 删除开发中的意外提交

0.1 - 2008-11-11

  • 首次发布

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

collective.redirect-0.5.tar.gz (7.1 kB 查看散列)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面