@@ -16,221 +16,9 @@ server {
16
16
17
17
autoindex on;
18
18
19
- # Python 3 docs are the default at the root.
20
- location = / {
21
- return 302 $scheme://$host/3/;
22
- }
23
-
24
- # Python 3 docs are the default at the root of each translations.
25
- location ~ ^/(es|fr|id|it|ja|ko|pl|pt-br|tr|uk|zh-cn|zh-tw)/$ {
26
- return 302 $scheme://$host/$1/3/;
27
- }
28
-
29
- # Pretty 404 for archives telling to wait for them to be built.
30
- location ~ \.(pdf|zip|epub|bz2)$ {
31
- error_page 404 /404.html;
32
- }
33
-
34
- # Some doc download pages link to docs.python.org/ftp instead of www.python.org/ftp.
35
- location ^~ /ftp/ {
36
- return 301 https://www.python.org$request_uri;
37
- }
38
-
39
- location ~ /py3k(.*)$ {
40
- return 301 https://$host/3$1;
41
- }
42
-
43
- # Smooth the switch between versions by mapping old files to their new location
44
- location ~ ^/([a-z-]*/)?(3|3.6|3.7|3.8)/library/email.util.html$ {
45
- return 301 https://$host/$1$2/library/email.utils.html;
46
- }
47
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/c-api/(class|cobject|int|string).html$ {
48
- return 301 https://$host/$1$2/c-api/;
49
- }
50
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/howto/(doanddont|webservers).html$ {
51
- return 301 https://$host/$1$2/;
52
- }
53
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/(aepack|aetools|aetypes|al|autogil|bastion|bsddb|carbon|cd|colorpicker|commands|compiler|dbhash|dircache|dl|dummy_thread|easydialogs|fl|fm|fpectl|fpformat|framework|future_builtins|gensuitemodule|gl|hotshot|htmllib|ic|imageop|imgfile|imputil|jpeg|mac|macos|macosa|macostools|md5|mhlib|mimetools|mimewriter|mimify|miniaeframe|multifile|mutex|new|popen2|posixfile|restricted|rexec|rfc822|sgi|sgmllib|sha|someos|statvfs|sun|sunaudio|user).html$ {
54
- return 301 https://$host/$1$2/;
55
- }
56
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/strings.html$ {
57
- return 301 https://$host/$1$2/library/text.html;
58
- }
59
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/stringio.html$ {
60
- return 301 https://$host/$1$2/library/io.html#io.StringIO;
61
- }
62
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/sets.html$ {
63
- return 301 https://$host/$1$2/library/stdtypes.html#set-types-set-frozenset;
64
- }
65
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/userdict.html$ {
66
- return 301 https://$host/$1$2/library/collections.html#userdict-objects;
67
- }
68
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/repr.html$ {
69
- return 301 https://$host/$1$2/library/reprlib.html;
70
- }
71
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/copy_reg.html$ {
72
- return 301 https://$host/$1$2/library/copyreg.html;
73
- }
74
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/anydbm.html$ {
75
- return 301 https://$host/$1$2/library/dbm.html;
76
- }
77
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/whichdb.html$ {
78
- return 301 https://$host/$1$2/library/dbm.html#dbm.whichdb;
79
- }
80
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/dumbdbm.html$ {
81
- return 301 https://$host/$1$2/library/dbm.html#module-dbm.dumb;
82
- }
83
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/gdbm.html$ {
84
- return 301 https://$host/$1$2/library/dbm.html#module-dbm.gnu;
85
- }
86
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/robotparser.html$ {
87
- return 301 https://$host/$1$2/library/urllib.robotparser.html;
88
- }
89
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/thread.html$ {
90
- return 301 https://$host/$1$2/library/_thread.html;
91
- }
92
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/email-examples.html$ {
93
- return 301 https://$host/$1$2/library/email.examples.html;
94
- }
95
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/htmlparser.html$ {
96
- return 301 https://$host/$1$2/library/html.parser.html;
97
- }
98
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/urllib2.html$ {
99
- return 301 https://$host/$1$2/library/urllib.request.html;
100
- }
101
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/httplib.html$ {
102
- return 301 https://$host/$1$2/library/http.client.html;
103
- }
104
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/urlparse.html$ {
105
- return 301 https://$host/$1$2/library/urllib.parse.html;
106
- }
107
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/basehttpserver.html$ {
108
- return 301 https://$host/$1$2/library/http.server.html;
109
- }
110
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/simplehttpserver.html$ {
111
- return 301 https://$host/$1$2/library/http.server.html#http.server.SimpleHTTPRequestHandler;
112
- }
113
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/cgihttpserver.html$ {
114
- return 301 https://$host/$1$2/library/http.server.html#http.server.CGIHTTPRequestHandler;
115
- }
116
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/cookielib.html$ {
117
- return 301 https://$host/$1$2/library/http.cookiejar.html;
118
- }
119
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/cookie.html$ {
120
- return 301 https://$host/$1$2/library/http.cookies.html;
121
- }
122
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/xmlrpclib.html$ {
123
- return 301 https://$host/$1$2/library/xmlrpc.client.html;
124
- }
125
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/simplexmlrpcserver.html$ {
126
- return 301 https://$host/$1$2/library/xmlrpc.server.html;
127
- }
128
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/docxmlrpcserver.html$ {
129
- return 301 https://$host/$1$2/library/xmlrpc.server.html#documenting-xmlrpc-server;
130
- }
131
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/ttk.html$ {
132
- return 301 https://$host/$1$2/library/tkinter.ttk.html;
133
- }
134
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/tix.html$ {
135
- return 301 https://$host/$1$2/library/tkinter.tix.html;
136
- }
137
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/scrolledtext.html$ {
138
- return 301 https://$host/$1$2/library/tkinter.scrolledtext.html;
139
- }
140
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/__builtin__.html$ {
141
- return 301 https://$host/$1$2/library/builtins.html;
142
- }
143
- location ~ ^/([a-z-]*/)?(3|3.5|3.6|3.7|3.8|3.9|3.10)/library/_winreg.html$ {
144
- return 301 https://$host/$1$2/library/winreg.html;
145
- }
146
- location ~ ^/([a-z-]*/)?(3|3.12|3.13|3.14)/library/(asynchat|asyncore|smtpd).html$ {
147
- return 301 https://$host/$1$2/;
148
- }
149
- location ~ ^/([a-z-]*/)?(3.13|3.14)/library/(2to3|aifc|audioop|cgi|cgitb|chunk|crypt|imghdr|mailcap|msilib|nis|nntplib|ossaudiodev|pipes|sndhdr|spwd|sunau|telnetlib|tkinter.tix|uu|xdrlib).html$ {
150
- return 301 https://$host/$1$2/;
151
- }
152
-
153
- # Map /documenting to the devguide.
154
- location ~ ^/devguide/(.*)$ {
155
- return 301 https://devguide.python.org/$1;
156
- }
157
- location = /documenting/ {
158
- return 301 https://devguide.python.org/documentation/start-documenting/;
159
- }
160
- location = /documenting/index.html {
161
- return 301 https://devguide.python.org/documentation/start-documenting/;
162
- }
163
- location = /documenting/intro.html {
164
- return 301 https://devguide.python.org/documentation/start-documenting/#introduction;
165
- }
166
- location = /documenting/style.html {
167
- return 301 https://devguide.python.org/documentation/style-guide/;
168
- }
169
- location = /documenting/rest.html {
170
- return 301 https://devguide.python.org/documentation/markup/;
171
- }
172
- location = /documenting/markup.html {
173
- return 301 https://devguide.python.org/documentation/markup/;
174
- }
175
- location = /documenting/fromlatex.html {
176
- return 301 https://devguide.python.org/documentation/markup/;
177
- }
178
- location = /documenting/building.html {
179
- return 301 https://devguide.python.org/documentation/start-documenting/#building-the-documentation;
180
- }
181
-
182
- # Map toplevel URIs to Python 3 docs.
183
- location ~ ^/((archives|c-api|distutils|extending|faq|howto|install|library|reference|tutorial|using|whatsnew|_images|_sources|_static)(/.*)?)$ {
184
- return 301 https://$host/3/$1;
185
- }
186
- location ~ ^/(about|bugs|contents|copyright|download|genindex.*|glossary|index|license|py-modindex|search)(.html)?$ {
187
- return 301 https://$host/3/$1.html;
188
- }
189
- location ~ ^/(searchindex.js|objects.inv)$ {
190
- return 301 https://$host/3/$1;
191
- }
192
-
193
- # Emulate Apache's content-negotiation. Was a temporary measure,
194
- # but now people are using it like a feature.
195
- # Redirect ``$request_uri`` -> ``$request_uri.html``,
196
- # where the latter is a valid webpage.
197
- location ~ ^/((2|3)(\.[0-9]+)?|dev)/\w+/[\d\w\.]+(?!\.html)$ {
198
- if (-f "${request_filename}.html") {
199
- return 301 https://$host:$request_uri.html;
200
- }
201
- }
202
-
203
- # Map old, 2.5-and-earlier directory names to 2.6-and-later names.
204
- location = /lib/ {
205
- return 301 https://$host/library/;
206
- }
207
- location ~ ^/lib/module-([a-zA-Z0-9.]+)\.html$ {
208
- return 301 https://$host/library/$1.html;
209
- }
210
- location = /tut/ {
211
- return 301 https://$host/tutorial/;
212
- }
213
- location = /tut/tut.html {
214
- return 301 https://$host/tutorial/;
215
- }
216
- location = /api/ {
217
- return 301 https://$host/c-api/;
218
- }
219
- location = /ext/ {
220
- return 301 https://$host/extending/;
221
- }
222
- location = /dist/ {
223
- return 301 https://docs.python.org/distutils/;
224
- }
225
- location = /inst/ {
226
- return 301 https://$host/install/;
227
- }
228
- location = /doc/ {
229
- return 301 https://devguide.python.org/documenting.html;
230
- }
231
- location = /ref/ {
232
- return 301 https://$host/reference/;
233
- }
19
+ # The redirect config for docs.python.org is in a separate file
20
+ # to allow automatic testing via Hurl (https://hurl.dev/)
21
+ include docs-redirects.conf;
234
22
}
235
23
236
24
server {
0 commit comments