diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html
index 9e6ea379a6..1bd8155f40 100644
--- a/src/pretix/presale/templates/pretixpresale/event/base.html
+++ b/src/pretix/presale/templates/pretixpresale/event/base.html
@@ -40,7 +40,7 @@
{% if request.event.settings.locales|length > 1 %}
{% for l in languages %}
-
+
{{ l.name_local }}
{% endfor %}
diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py
index 0d5e51f22b..4b27c301e7 100644
--- a/src/pretix/presale/urls.py
+++ b/src/pretix/presale/urls.py
@@ -6,6 +6,7 @@ import pretix.presale.views.event
import pretix.presale.views.locale
import pretix.presale.views.order
import pretix.presale.views.organizer
+import pretix.presale.views.robots
import pretix.presale.views.user
import pretix.presale.views.waiting
@@ -83,4 +84,5 @@ organizer_patterns = [
locale_patterns = [
url(r'^locale/set$', pretix.presale.views.locale.LocaleSet.as_view(), name='locale.set'),
+ url(r'^robots.txt$', pretix.presale.views.robots.robots_txt, name='robots.txt'),
]
diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py
index 360d8664bc..c947a3005b 100644
--- a/src/pretix/presale/views/cart.py
+++ b/src/pretix/presale/views/cart.py
@@ -22,6 +22,7 @@ from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.views import EventViewMixin
from pretix.presale.views.async import AsyncAction
from pretix.presale.views.event import item_group_by_category
+from pretix.presale.views.robots import NoSearchIndexViewMixin
class CartActionMixin:
@@ -177,7 +178,7 @@ class CartAdd(EventViewMixin, CartActionMixin, AsyncAction, View):
return redirect(self.get_error_url())
-class RedeemView(EventViewMixin, TemplateView):
+class RedeemView(NoSearchIndexViewMixin, EventViewMixin, TemplateView):
template_name = "pretixpresale/event/voucher.html"
def get_context_data(self, **kwargs):
diff --git a/src/pretix/presale/views/locale.py b/src/pretix/presale/views/locale.py
index 7a605837ce..4914e8776c 100644
--- a/src/pretix/presale/views/locale.py
+++ b/src/pretix/presale/views/locale.py
@@ -5,8 +5,10 @@ from django.http import HttpResponseRedirect
from django.utils.http import is_safe_url
from django.views.generic import View
+from .robots import NoSearchIndexViewMixin
-class LocaleSet(View):
+
+class LocaleSet(NoSearchIndexViewMixin, View):
def get(self, request, *args, **kwargs):
url = request.GET.get('next', request.META.get('HTTP_REFERER', '/'))
diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py
index 7613adde80..532aca17fc 100644
--- a/src/pretix/presale/views/order.py
+++ b/src/pretix/presale/views/order.py
@@ -29,9 +29,10 @@ from pretix.presale.forms.checkout import InvoiceAddressForm
from pretix.presale.views import CartMixin, EventViewMixin
from pretix.presale.views.async import AsyncAction
from pretix.presale.views.questions import QuestionsViewMixin
+from pretix.presale.views.robots import NoSearchIndexViewMixin
-class OrderDetailMixin:
+class OrderDetailMixin(NoSearchIndexViewMixin):
@cached_property
def order(self):
order = self.request.event.orders.filter(code=self.kwargs['order']).select_related('event').first()
diff --git a/src/pretix/presale/views/robots.py b/src/pretix/presale/views/robots.py
new file mode 100644
index 0000000000..09f2b101fe
--- /dev/null
+++ b/src/pretix/presale/views/robots.py
@@ -0,0 +1,26 @@
+from django.http import HttpResponse
+from django.views.decorators.cache import cache_page
+
+
+class NoSearchIndexViewMixin:
+ def dispatch(self, request, *args, **kwargs):
+ resp = super().dispatch(request, *args, **kwargs)
+ resp['X-Robots-Tag'] = "noindex"
+ return resp
+
+
+@cache_page(3600)
+def robots_txt(request):
+ return HttpResponse(
+ """User-agent: *
+Disallow: */cart/*
+Disallow: */checkout/*
+Disallow: */order/*
+Disallow: */locale/set*
+Disallow: /control/
+Disallow: /download/
+Disallow: /redirect/
+Disallow: /api/
+Disallow: /download/
+""", content_type='text/plain'
+ )