Skip to main content

No acquistion during publish traverse

Project description


The problem with “acquisition” and publishTraverse is that the current method
returns too many different URLs for the same content. For instance here is
some potential url for the “kb” page of the website

- ...

and here is a generic "Plone" site with two content items "a" and "b" (folderish or not)

- ...

All the urls above returns 200 with the same content, while I would like the
"canonical url" to return 200 and the other to return 404.

The behaviour described above constitute a problem because:

* multiple url for the same content is a problem for SEO and is confusing to
people. For SEO, in the latest versions Plone introduced the canonical META,
but IMHO it's just a workaround. People are confused. For example: sometimes
some of my editors ask me: "I can't remove the Can you do it for me?"

* the page doesn’t seem really the same on all urls: if you open and the second has a
portlet that the first is missing

* removing page from external cache (varnish or squid), for example after a
content modification, will be a pain, because for the same content there
could be multiple urls without any control or rules (collective.purgebyid
solve this)

* when using subsite (or multiple plone site on the same zope app) the
problem is even more annoying: suppose that "a" is a subsite (marked with
INavigationRoot) for and "b" for,
opening the url will probably show the homepage of
site "a" inside the "b" site (collective.siteisolation and probably
collective.lineage do something to isolate subsite, but IMHO again are only


This is a monkey patch for publishTraverse method of Zope2's

By default invalid traverse are only logged as warning.

For enable raising exceptions, you need to manually modify
changing DRYRUN to False.

Or using plone.recipe.zope2instance, e.g.::

recipe = plone.recipe.zope2instance
initialization =
from experimental.noacquisition import config
config.DRYRUN = False


This add-on is tested using Travis CI. The current status of the add-on is :

.. image::

Other solutions

There is a more elegant solution in a branch of Products.CMFPlone, that makes
use of IPubAfterTraversal event instead of a monkey patch. But seems that
currently it doesn't works for all cases, at least when there is a custom
traversal at the end of the request (take a look at the tests inside this package).

There is also another package with same approach as CMFPlone's branch:



Don't use it, if you don't know exactly what are you doing... at least use
leaving DRYRUN=True.

This doesn't stop publication without explicit acquisition with
all objects using explicitly ``__bobo_traverse__`` method.


1.0.0dev (unreleased)

- Initial release

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for experimental.noacquisition, version 1.0.0a3
Filename, size File type Python version Upload date Hashes
Filename, size experimental.noacquisition-1.0.0a3.tar.gz (11.8 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page