-
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy path.htaccess
222 lines (210 loc) · 16 KB
/
.htaccess
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# -----------------
# custom error page
# -----------------
ErrorDocument 404 /404.html
# -------------
# cache-control
# -------------
# one week for css and js assets
<filesMatch "\.(css|js)$">
Header set Cache-Control "max-age=604800, public"
</filesMatch>
# two weeks for images
<filesMatch "\.(jpg|jpeg|png|gif|ico)$">
Header set Cache-Control "max-age=1209600, public"
</filesMatch>
# one month for fonts
<filesMatch "\.(ttf|svg|eot|woff|woff2)$">
Header set Cache-Control "max-age=2628000, public"
</filesMatch>
# never for archives or feeds (xml, json)
<filesMatch "\.(zip|tar|dmg|xml|json)$">
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate, public"
</filesMatch>
# -------------
# redirects for top-level pages
# -------------
Redirect 301 /resume/ /linkedout/
Redirect 301 /resume /linkedout/
Redirect 301 /cv/ /linkedout/
Redirect 301 /cv /linkedout/
Redirect 301 /work/ /linkedout/
Redirect 301 /work /linkedout/
Redirect 301 /opensource/ /projects/
Redirect 301 /opensource /projects/
# -------------
# redirects for old blog URLs
# 1: moved from /title to /blog/title
# 2: moved from /blog/title to /blog/year/month/day/title
# -------------
Redirect 301 /built-with-open-source /blog/2014/06/09/built-with-open-source
Redirect 301 /apples-to-apples /blog/2014/06/25/apples-to-apples
Redirect 301 /status-bars-matter /blog/2014/08/03/status-bars-matter
Redirect 301 /apples-to-apples-part-two /blog/2014/08/06/apples-to-apples-part-two
Redirect 301 /on-the-value-of-benchmarks /blog/2014/08/19/on-the-value-of-benchmarks
Redirect 301 /apples-to-apples-part-three /blog/2014/08/21/apples-to-apples-part-three
Redirect 301 /adaptive-user-interfaces /blog/2014/10/01/adaptive-user-interfaces
Redirect 301 /swift-failable-initializers /blog/2014/10/22/swift-failable-initializers
Redirect 301 /rosetta-stone-contributes /blog/2014/12/05/rosetta-stone-contributes
Redirect 301 /introducing-jsqmessagesvc-6-0 /blog/2014/12/08/introducing-jsqmessagesvc-6-0
Redirect 301 /swift-coredata-and-testing /blog/2015/01/05/swift-coredata-and-testing
Redirect 301 /better-coredata-models-in-swift /blog/2015/02/17/better-coredata-models-in-swift
Redirect 301 /functional-notifications /blog/2015/03/31/functional-notifications
Redirect 301 /swift-failable-initializers-revisited /blog/2015/04/06/swift-failable-initializers-revisited
Redirect 301 /using-core-data-in-swift /blog/2015/05/25/using-core-data-in-swift
Redirect 301 /swift-namespaced-constants /blog/2015/07/19/swift-namespaced-constants
Redirect 301 /swift-enumerations-and-equatable /blog/2015/07/26/swift-enumerations-and-equatable
Redirect 301 /UIKit-changes-in-iOS-9 /blog/2015/10/14/UIKit-changes-in-iOS-9
Redirect 301 /building-data-sources-in-swift /blog/2015/10/25/building-data-sources-in-swift
Redirect 301 /swift-open-source /blog/2015/12/06/swift-open-source
Redirect 301 /open-source-swift-weekly-1 /blog/2015/12/10/open-source-swift-weekly-1
Redirect 301 /open-source-swift-weekly-2 /blog/2015/12/17/open-source-swift-weekly-2
Redirect 301 /open-source-swift-weekly-3 /blog/2015/12/24/open-source-swift-weekly-3
Redirect 301 /open-source-swift-weekly-4 /blog/2016/01/07/open-source-swift-weekly-4
Redirect 301 /new-weekly-brief /blog/2016/01/14/new-weekly-brief
Redirect 301 /jsqmessages-call-for-contributors /blog/2016/02/06/jsqmessages-call-for-contributors
Redirect 301 /swifty-presenters /blog/2016/02/19/swifty-presenters
Redirect 301 /contributing-to-swift /blog/2016/03/21/contributing-to-swift
Redirect 301 /swift-documentation /blog/2016/05/20/swift-documentation
Redirect 301 /open-source-everything /blog/2016/05/22/open-source-everything
Redirect 301 /avoiding-objc-in-swift /blog/2016/06/04/avoiding-objc-in-swift
Redirect 301 /the-a5-is-dead /blog/2016/06/14/the-a5-is-dead
Redirect 301 /swift-3-sherlocked-my-libraries /blog/2016/07/03/swift-3-sherlocked-my-libraries
Redirect 301 /migrating-to-swift-3 /blog/2016/07/25/migrating-to-swift-3
Redirect 301 /enums-as-configs /blog/2016/07/31/enums-as-configs
Redirect 301 /speaking-at-frenchkit /blog/2016/09/30/speaking-at-frenchkit
Redirect 301 /shipping-swift-3 /blog/2016/10/01/shipping-swift-3
Redirect 301 /understanding-swift-evolution /blog/2016/10/03/understanding-swift-evolution
Redirect 301 /contributing-to-swift-weekly /blog/2016/10/06/contributing-to-swift-weekly
Redirect 301 /140-proposals-frenchkit-video /blog/2016/11/05/140-proposals-frenchkit-video
Redirect 301 /swift-documentation-part-2 /blog/2017/01/08/swift-documentation-part-2
Redirect 301 /testing-without-ocmock /blog/2017/01/16/testing-without-ocmock
Redirect 301 /pushing-limits-of-pop /blog/2017/01/23/pushing-limits-of-pop
Redirect 301 /prioritization /blog/2017/02/08/prioritization
Redirect 301 /sleazy-recruiting /blog/2017/02/09/sleazy-recruiting
Redirect 301 /refactoring-singletons-in-swift /blog/2017/02/10/refactoring-singletons-in-swift
Redirect 301 /adapting-to-change-and-cutting-corners /blog/2017/02/15/adapting-to-change-and-cutting-corners
Redirect 301 /swift-unwrapped /blog/2017/03/07/swift-unwrapped
Redirect 301 /thoughts-on-swift-access-control /blog/2017/04/05/thoughts-on-swift-access-control
Redirect 301 /a-fair-hotel /blog/2017/05/28/a-fair-hotel
# -------------
# redirects for previous blog URLs
# moved from /blog/title to /blog/year/month/day/title
# -------------
Redirect 301 /blog/built-with-open-source /blog/2014/06/09/built-with-open-source
Redirect 301 /blog/apples-to-apples /blog/2014/06/25/apples-to-apples
Redirect 301 /blog/status-bars-matter /blog/2014/08/03/status-bars-matter
Redirect 301 /blog/apples-to-apples-part-two /blog/2014/08/06/apples-to-apples-part-two
Redirect 301 /blog/on-the-value-of-benchmarks /blog/2014/08/19/on-the-value-of-benchmarks
Redirect 301 /blog/apples-to-apples-part-three /blog/2014/08/21/apples-to-apples-part-three
Redirect 301 /blog/adaptive-user-interfaces /blog/2014/10/01/adaptive-user-interfaces
Redirect 301 /blog/swift-failable-initializers /blog/2014/10/22/swift-failable-initializers
Redirect 301 /blog/rosetta-stone-contributes /blog/2014/12/05/rosetta-stone-contributes
Redirect 301 /blog/introducing-jsqmessagesvc-6-0 /blog/2014/12/08/introducing-jsqmessagesvc-6-0
Redirect 301 /blog/swift-coredata-and-testing /blog/2015/01/05/swift-coredata-and-testing
Redirect 301 /blog/better-coredata-models-in-swift /blog/2015/02/17/better-coredata-models-in-swift
Redirect 301 /blog/functional-notifications /blog/2015/03/31/functional-notifications
Redirect 301 /blog/swift-failable-initializers-revisited /blog/2015/04/06/swift-failable-initializers-revisited
Redirect 301 /blog/using-core-data-in-swift /blog/2015/05/25/using-core-data-in-swift
Redirect 301 /blog/swift-namespaced-constants /blog/2015/07/19/swift-namespaced-constants
Redirect 301 /blog/swift-enumerations-and-equatable /blog/2015/07/26/swift-enumerations-and-equatable
Redirect 301 /blog/UIKit-changes-in-iOS-9 /blog/2015/10/14/UIKit-changes-in-iOS-9
Redirect 301 /blog/building-data-sources-in-swift /blog/2015/10/25/building-data-sources-in-swift
Redirect 301 /blog/swift-open-source /blog/2015/12/06/swift-open-source
Redirect 301 /blog/open-source-swift-weekly-1 /blog/2015/12/10/open-source-swift-weekly-1
Redirect 301 /blog/open-source-swift-weekly-2 /blog/2015/12/17/open-source-swift-weekly-2
Redirect 301 /blog/open-source-swift-weekly-3 /blog/2015/12/24/open-source-swift-weekly-3
Redirect 301 /blog/open-source-swift-weekly-4 /blog/2016/01/07/open-source-swift-weekly-4
Redirect 301 /blog/new-weekly-brief /blog/2016/01/14/new-weekly-brief
Redirect 301 /blog/jsqmessages-call-for-contributors /blog/2016/02/06/jsqmessages-call-for-contributors
Redirect 301 /blog/swifty-presenters /blog/2016/02/19/swifty-presenters
Redirect 301 /blog/contributing-to-swift /blog/2016/03/21/contributing-to-swift
Redirect 301 /blog/swift-documentation /blog/2016/05/20/swift-documentation
Redirect 301 /blog/open-source-everything /blog/2016/05/22/open-source-everything
Redirect 301 /blog/avoiding-objc-in-swift /blog/2016/06/04/avoiding-objc-in-swift
Redirect 301 /blog/the-a5-is-dead /blog/2016/06/14/the-a5-is-dead
Redirect 301 /blog/swift-3-sherlocked-my-libraries /blog/2016/07/03/swift-3-sherlocked-my-libraries
Redirect 301 /blog/migrating-to-swift-3 /blog/2016/07/25/migrating-to-swift-3
Redirect 301 /blog/enums-as-configs /blog/2016/07/31/enums-as-configs
Redirect 301 /blog/speaking-at-frenchkit /blog/2016/09/30/speaking-at-frenchkit
Redirect 301 /blog/shipping-swift-3 /blog/2016/10/01/shipping-swift-3
Redirect 301 /blog/understanding-swift-evolution /blog/2016/10/03/understanding-swift-evolution
Redirect 301 /blog/contributing-to-swift-weekly /blog/2016/10/06/contributing-to-swift-weekly
Redirect 301 /blog/140-proposals-frenchkit-video /blog/2016/11/05/140-proposals-frenchkit-video
Redirect 301 /blog/swift-documentation-part-2 /blog/2017/01/08/swift-documentation-part-2
Redirect 301 /blog/testing-without-ocmock /blog/2017/01/16/testing-without-ocmock
Redirect 301 /blog/pushing-limits-of-pop /blog/2017/01/23/pushing-limits-of-pop
Redirect 301 /blog/prioritization /blog/2017/02/08/prioritization
Redirect 301 /blog/sleazy-recruiting /blog/2017/02/09/sleazy-recruiting
Redirect 301 /blog/refactoring-singletons-in-swift /blog/2017/02/10/refactoring-singletons-in-swift
Redirect 301 /blog/adapting-to-change-and-cutting-corners /blog/2017/02/15/adapting-to-change-and-cutting-corners
Redirect 301 /blog/swift-unwrapped /blog/2017/03/07/swift-unwrapped
Redirect 301 /blog/thoughts-on-swift-access-control /blog/2017/04/05/thoughts-on-swift-access-control
Redirect 301 /blog/a-fair-hotel /blog/2017/05/28/a-fair-hotel
Redirect 301 /blog/writing-better-singletons-in-swift /blog/2017/06/04/writing-better-singletons-in-swift
Redirect 301 /blog/protocol-composition-in-swift-and-objc /blog/2017/06/05/protocol-composition-in-swift-and-objc
Redirect 301 /blog/officially-deprecating-jsqmessagesviewcontroller /blog/2017/07/16/officially-deprecating-jsqmessagesviewcontroller
Redirect 301 /blog/a-story-about-swift-source-compat /blog/2017/07/17/a-story-about-swift-source-compat
Redirect 301 /blog/customizing-git-log /blog/2017/08/08/customizing-git-log
Redirect 301 /blog/data-society-media-manipulation /blog/2017/08/13/data-society-media-manipulation
Redirect 301 /blog/supporting-json-feed /blog/2017/09/03/supporting-json-feed
Redirect 301 /blog/building-a-site-with-jekyll-on-nfsn /blog/2017/09/10/building-a-site-with-jekyll-on-nfsn
Redirect 301 /blog/measuring-compile-times-xcode9 /blog/2017/09/18/measuring-compile-times-xcode9
Redirect 301 /blog/when-your-app-is-used-in-unexpected-ways /blog/2017/09/24/when-your-app-is-used-in-unexpected-ways
Redirect 301 /blog/floating-point-swift-ulp-and-epsilon /blog/2017/10/01/floating-point-swift-ulp-and-epsilon
Redirect 301 /blog/swift-weekly-brief-hiatus /blog/2017/12/28/swift-weekly-brief-hiatus
Redirect 301 /blog/how-to-sysdiagnose-ios /blog/2018/02/08/how-to-sysdiagnose-ios
Redirect 301 /blog/replacing-google-with-duckduckgo /blog/2018/02/25/replacing-google-with-duckduckgo
Redirect 301 /blog/upgrading-to-bootstrap-4 /blog/2018/04/16/upgrading-to-bootstrap-4
Redirect 301 /blog/removing-google-analytics-too /blog/2018/04/22/removing-google-analytics-too
Redirect 301 /blog/why-optional-swift-closures-are-escaping /blog/2018/06/10/why-optional-swift-closures-are-escaping
Redirect 301 /blog/thoughts-on-wwdc-2018 /blog/2018/06/11/thoughts-on-wwdc-2018
Redirect 301 /blog/xcode-tip-improving-assistant-editor /blog/2018/06/12/xcode-tip-improving-assistant-editor
Redirect 301 /blog/swift-unwrapped-at-wwdc-2018 /blog/2018/06/13/swift-unwrapped-at-wwdc-2018
Redirect 301 /blog/reading-adichie-dear-ijeawele /blog/2018/06/16/reading-adichie-dear-ijeawele
Redirect 301 /blog/choosing-a-vpn-service /blog/2018/06/24/choosing-a-vpn-service
Redirect 301 /blog/til-tor-browser /blog/2018/06/27/til-tor-browser
Redirect 301 /blog/xcode-tip-debugging-behavior-new-tab /blog/2018/07/01/xcode-tip-debugging-behavior-new-tab
Redirect 301 /blog/swifts-new-calling-convention /blog/2018/07/05/swifts-new-calling-convention
Redirect 301 /blog/blaming-homelessness-on-the-homeless-sf /blog/2018/07/19/blaming-homelessness-on-the-homeless-sf
Redirect 301 /blog/swift-tip-building-arrays-with-compactmap /blog/2018/07/29/swift-tip-building-arrays-with-compactmap
Redirect 301 /blog/the-four-agreements /blog/2018/07/30/the-four-agreements
Redirect 301 /blog/15-years-later /blog/2018/09/26/15-years-later
Redirect 301 /blog/lars-and-the-basket-of-apples /blog/2018/10/08/lars-and-the-basket-of-apples
Redirect 301 /blog/debugging-subtle-swift-bug-facepalm /blog/2018/11/07/debugging-subtle-swift-bug-facepalm
Redirect 301 /blog/executing-applescript-in-mac-app-on-macos-mojave /blog/2018/11/17/executing-applescript-in-mac-app-on-macos-mojave
Redirect 301 /blog/reading-list-2018 /blog/2019/01/05/reading-list-2018
Redirect 301 /blog/how-to-estimate-engineering-project-timelines /blog/2019/02/25/how-to-estimate-engineering-project-timelines
Redirect 301 /blog/reading-notes-1 /blog/2019/03/22/reading-notes-1
Redirect 301 /blog/introducing-lucifer /blog/2019/03/26/introducing-lucifer
Redirect 301 /blog/reading-notes-2 /blog/2019/08/07/reading-notes-2
Redirect 301 /blog/linked-out /blog/2019/08/13/linked-out
Redirect 301 /blog/implementing-right-click-for-nsbutton /blog/2019/08/15/implementing-right-click-for-nsbutton
Redirect 301 /blog/update-to-lucifer /blog/2019/08/16/update-to-lucifer
Redirect 301 /blog/workaround-highlight-bug-nsstatusitem /blog/2019/08/16/workaround-highlight-bug-nsstatusitem
Redirect 301 /blog/my-dad-ate-an-impossible-whopper /blog/2019/08/19/my-dad-ate-an-impossible-whopper
Redirect 301 /blog/introducing-red-eye /blog/2019/09/03/introducing-red-eye
Redirect 301 /blog/announcing-plurals-and-noun /blog/2019/09/13/announcing-plurals-and-noun
Redirect 301 /blog/swift-unwrapped-5-1-doug-gregor /blog/2019/09/16/swift-unwrapped-5-1-doug-gregor
Redirect 301 /blog/the-aca-and-your-credit-report /blog/2019/09/19/the-aca-and-your-credit-report
Redirect 301 /blog/overriding-status-bar-settings-ios-simulator /blog/2019/09/26/overriding-status-bar-settings-ios-simulator
Redirect 301 /blog/icloud-backup-using-rsync /blog/2019/09/27/icloud-backup-using-rsync
Redirect 301 /blog/reading-notes-3 /blog/2019/09/29/reading-notes-3
Redirect 301 /blog/reading-notes-4 /blog/2019/09/29/reading-notes-4
Redirect 301 /blog/automating-simctl-status-bar /blog/2019/09/30/automating-simctl-status-bar
Redirect 301 /blog/reading-list-2019 /blog/2020/01/04/reading-list-2019
Redirect 301 /blog/selecting-an-xcode-version-on-github-ci /blog/2020/01/06/selecting-an-xcode-version-on-github-ci
Redirect 301 /blog/observing-appearance-changes-on-ios-and-macos /blog/2020/01/08/observing-appearance-changes-on-ios-and-macos
Redirect 301 /blog/time-machine-failing-on-macos-catalina /blog/2020/01/10/time-machine-failing-on-macos-catalina
Redirect 301 /blog/apple-script-to-export-open-safari-tabs-to-omnifocus /blog/2020/01/14/apple-script-to-export-open-safari-tabs-to-omnifocus
Redirect 301 /blog/xcode-tip-breakpoints-as-bookmarks /blog/2020/01/21/xcode-tip-breakpoints-as-bookmarks
Redirect 301 /blog/github-default-community-health-files /blog/2020/01/24/github-default-community-health-files
Redirect 301 /blog/mac-app-tests-fail-with-hardened-runtime /blog/2020/02/23/mac-app-tests-fail-with-hardened-runtime
Redirect 301 /blog/replacing-cocoapods-with-swiftpm /blog/2020/02/24/replacing-cocoapods-with-swiftpm
Redirect 301 /blog/jetbrains-mono-and-disabling-font-ligatures /blog/2020/02/25/jetbrains-mono-and-disabling-font-ligatures
Redirect 301 /blog/another-issue-with-swiftpm-xcode-integration /blog/2020/03/04/another-issue-with-swiftpm-xcode-integration
Redirect 301 /blog/implementing-dark-mode-with-cgcolor /blog/2020/03/23/implementing-dark-mode-with-cgcolor
Redirect 301 /blog/libraries-for-building-menu-bar-mac-apps /blog/2020/04/07/libraries-for-building-menu-bar-mac-apps
Redirect 301 /blog/running-danger-on-github-actions /blog/2020/04/10/running-danger-on-github-actions
Redirect 301 /blog/bay-area-mutual-aid-covid-19 /blog/2020/04/11/bay-area-mutual-aid-covid-19
Redirect 301 /blog/previously-previously-previously-relocated-items-in-macos-catalina /blog/2020/04/11/previously-previously-previously-relocated-items-in-macos-catalina