Skip to content

Commit 031ef72

Browse files
authored
Merge pull request #734 from keymanapp/fix/keyboards-redirect
fix: rewrite /keyboards for embed mode and skip localization
2 parents 9100e60 + 2feb595 commit 031ef72

3 files changed

Lines changed: 105 additions & 21 deletions

File tree

.htaccess

Lines changed: 84 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,85 @@ ErrorDocument 404 /_includes/errors/404.php
2828

2929
RewriteRule "^_includes/errors/404(.php)?$" "/_includes/errors/404.php" [END]
3030

31+
# ##############################################################################
32+
#
33+
# Keyman 14.0 - 18.0 have a dependency on /keyboards which means that we cannot
34+
# rewrite URLs there when we are in 'embed' mode for those apps. The apps check
35+
# if the URL starts with /keyboards, and handle those paths internally, while
36+
# opening other URLs in an external browser.
37+
#
38+
# See https://github.com/keymanapp/keyman/issues/15948 for platform-specific
39+
# dependencies on this behaviour and for v19.0 planned mitigations.
40+
#
41+
# These rules are duplicated for the locale-aware versions for web browser
42+
# visitors later in this file.
43+
#
44+
# ##############################################################################
45+
46+
#
47+
# keyboards Install | Download | Share | bare | .json -->
48+
#
49+
50+
# /keyboards/install/[id] to /keyboards/install.php
51+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
52+
RewriteCond "%{QUERY_STRING}" embed
53+
RewriteRule "^keyboards/install/([^/]+)$" "/_content/keyboards/install.php?id=$1" [END,QSA]
54+
55+
# /keyboards/download/[id] to /keyboards/keyboard.php
56+
# This formerly redirected to a download, but we no longer need it; keep it for
57+
# legacy links
58+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
59+
RewriteCond "%{QUERY_STRING}" embed
60+
RewriteRule "^keyboards/download/([^/]+)$" "/_content/keyboards/keyboard.php?id=$1" [END,QSA]
61+
62+
# /keyboards/share/[id] to /keyboards/share.php
63+
# if the keyboard exists in the repo, then share.php will redirect to /keyboards/<id>
64+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
65+
RewriteCond "%{QUERY_STRING}" embed
66+
RewriteRule "^keyboards/share/([^/]+)$" "/_content/keyboards/share.php?id=$1" [END,QSA]
67+
68+
# /keyboards/{id}.json to /keyboards/keyboard.json.php
69+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
70+
RewriteCond "%{QUERY_STRING}" embed
71+
RewriteRule "^keyboards/(?!keyboard.json)(.*)\.json$" "/_content/keyboards/keyboard.json.php?id=$1" [END]
72+
73+
# /keyboards/{id} to /keyboards/keyboard.php
74+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
75+
RewriteCond "%{QUERY_STRING}" embed
76+
RewriteRule "^keyboards/(?!index\.php|install|keyboard|session|share)([^/]+)$" "/_content/keyboards/keyboard.php?id=$1" [END,QSA]
77+
78+
#
79+
# keyboards search
80+
#
81+
82+
# /keyboards/languages to /keyboards/index.php
83+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
84+
RewriteCond "%{QUERY_STRING}" embed
85+
RewriteRule "^keyboards/languages/(.*)" "/_content/keyboards/index.php?q=l:id:$1" [END,QSA]
86+
87+
# /keyboards/download to /keyboards/download.php
88+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
89+
RewriteCond "%{QUERY_STRING}" embed
90+
RewriteRule "^keyboards/download(.php)?" "/_content/keyboards/download.php" [END,QSA]
91+
92+
# /keyboards/legacy to /keyboards/keyboard.php
93+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
94+
RewriteCond "%{QUERY_STRING}" embed
95+
RewriteRule "^keyboards/legacy/(.*)" "/_content/keyboards/keyboard.php?legacy=$1" [END]
96+
97+
# /keyboards/countries to /keyboards/index.php
98+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
99+
RewriteCond "%{QUERY_STRING}" embed
100+
RewriteRule "^keyboards/countries/(.*)" "/_content/keyboards/index.php?q=c:id:$1" [END]
101+
102+
# Root keyboard search to pass embed query?
103+
RewriteCond "%{HTTP_COOKIE}" embed_keyboards_no_locale_redirect [OR]
104+
RewriteCond "%{QUERY_STRING}" embed
105+
RewriteRule "^keyboards(/)?$" "/_content/keyboards/index.php" [END,QSA]
106+
107+
108+
109+
31110
# ##################################################################
32111
# Reject special and legacy top-level files without i18n
33112
# ##################################################################
@@ -64,14 +143,6 @@ RewriteRule "^(_common/assets)/(.+)$" - [END]
64143
RewriteRule "^(_common|_content|_includes|_scripts|.github|resources|tests)(/.*|$)" - [F,END]
65144
RewriteRule "^(.editorconfig|.gitattributes|.gitignore|build.sh|composer.json|composer.lock|crowdin.yml|Dockerfile|package-lock.json|package.json|phpunit.xml|README.md|TODO.md)$" - [F,END]
66145

67-
#
68-
# The following paths are accessible but controlled by sub-folder .htaccess:
69-
# _legacy/
70-
# Thus this rule currently has no effect but will come into play if the
71-
# _legacy/.htaccess file is removed.
72-
#
73-
RewriteRule "^(_legacy)(/.*|$)" - [F,END]
74-
75146
# ##################################################################
76147
# Handle special and legacy top-level files without i18n
77148
# ##################################################################
@@ -81,7 +152,6 @@ RewriteRule "^(_legacy)(/.*|$)" - [F,END]
81152
# but have .php and .md rewrites. They do not have sub-folders.
82153
# _common/assets/ (handled above because _common/ itself is excluded)
83154
# _control/
84-
# _ie_thunk/
85155
# _test/
86156
#
87157
# The following top-level files and folders do not have .php or .md rewrites
@@ -96,26 +166,26 @@ RewriteRule "^(_legacy)(/.*|$)" - [F,END]
96166
RewriteRule "^.well-known/apple-app-site-association$" "/.well-known/apple-app-site-association.json" [L]
97167

98168
# Add terminating slash on top-level folders by redirecting
99-
RewriteCond "$1" ^(_control|_ie_thunk|_test|.well-known|go|cdn)$
169+
RewriteCond "$1" ^(_control|_test|.well-known|go|cdn)$
100170
RewriteRule "^([^/]+)$" "$1/" [R,L]
101171

102172
# .php rewrite
103-
RewriteCond "$1" ^(_control|_ie_thunk|_test)$
173+
RewriteCond "$1" ^(_control|_test)$
104174
RewriteCond "%{DOCUMENT_ROOT}/$1/$2.php" -f
105175
RewriteRule "^([^/]+)/(.+)$" "/$1/$2.php" [END]
106176

107177
# .md rewrite
108-
RewriteCond "$1" ^(_control|_ie_thunk|_test)$
178+
RewriteCond "$1" ^(_control|_test)$
109179
RewriteCond "%{DOCUMENT_ROOT}/$1/$2.md" -f
110180
RewriteRule "^([^/]+)/(.+)$" "/_includes/includes/md/mdhost.php?file=$1/$2.md" [END]
111181

112182
# .md rewrite for folder; no .php rewrite for folder
113-
RewriteCond "$1" ^(_control|_ie_thunk|_test)$
183+
RewriteCond "$1" ^(_control|_test)$
114184
RewriteCond "%{DOCUMENT_ROOT}/$1/index.md" -f
115185
RewriteRule "^([^/]+)/$" "/_includes/includes/md/mdhost.php?file=$1/index.md" [END]
116186

117187
# Any existing file in any of those folders or sub folders
118-
RewriteCond "$1" ^(_control|_ie_thunk|_test|.well-known|go|cdn)$
188+
RewriteCond "$1" ^(_control|_test|.well-known|go|cdn)$
119189
RewriteCond "%{DOCUMENT_ROOT}/$1/$2" -f
120190
RewriteRule "^([^/]+)/(.+)$" - [END]
121191

_content/keyboards/session.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
$embed_developer = $embed == 'developer';
3434

3535
if($embed != 'none') {
36+
// Set a cookie header for subsequent requests so that we do not get a
37+
// locale redirect for embedded keyboard search for Keyman 14.0-18.0. See
38+
// /.htaccess for full discussion (line ~32)
39+
setcookie('embed_keyboards_no_locale_redirect','1');
40+
3641
$session_query = http_build_query([
3742
'embed' => $embed,
3843
'version' => $embed_version

cdn/dev/keyboard-search/search.mjs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ if(typeof window.embed_query == 'undefined') {
2323
window.embed_query = '';
2424
}
2525

26+
27+
// For embedded mode, use root-level /keyboards, for Keyman 14.0-18.0. See
28+
// /.htaccess for full discussion (line ~32)
29+
let page_root;
30+
if(window.embed && window.embed != 'none') {
31+
page_root = `/keyboards`;
32+
} else {
33+
page_root = `/${I18n.pageLocale()}/keyboards`;
34+
}
35+
2636
var embed_query_q = window.embed_query == '' ? '' : '?'+window.embed_query;
2737
var embed_query_x = window.embed_query == '' ? '' : '&'+window.embed_query;
2838

@@ -40,15 +50,14 @@ function getCurrentPath(q, page, obsolete) {
4050
obsolete = obsolete ? '&obsolete=1' : '';
4151
page = page > 1 ? 'page='+page : '';
4252
var path = '';
43-
const base = `/${I18n.pageLocale()}`;
4453
if(r && r[1].charAt(0) == 'c') {
45-
path = `${base}/keyboards/countries/`;
54+
path = `${page_root}/countries/`;
4655
} else if(r && r[1].charAt(0) == 'l') {
47-
path = `${base}/keyboards/languages/${r[3]}`;
56+
path = `${page_root}/languages/${r[3]}`;
4857
} else if(q == '') {
49-
path = `${base}/keyboards/`
58+
path = `${page_root}/`
5059
} else {
51-
path = `${base}/keyboards/?q=${encodeURIComponent(q)}`;
60+
path = `${page_root}/?q=${encodeURIComponent(q)}`;
5261
}
5362

5463
if(page + obsolete == '') {
@@ -294,9 +303,9 @@ function process_response(q, obsolete, res) {
294303
"</div>");
295304

296305
if(kbd.isDedicatedLandingPage) {
297-
$('.title a', k).text(kbd.name).attr('href', `/${I18n.pageLocale()}/keyboards/h/${kbd.id}${embed_query_q}`);
306+
$('.title a', k).text(kbd.name).attr('href', `${page_root}/h${kbd.id}${embed_query_q}`);
298307
} else {
299-
$('.title a', k).text(kbd.name).attr('href', '/' + I18n.pageLocale() + '/keyboards/'+kbd.id+(kbd.match.tag ? '?bcp47='+kbd.match.tag+embed_query_x : embed_query_q));
308+
$('.title a', k).text(kbd.name).attr('href', `${page_root}/${kbd.id}`+(kbd.match.tag ? '?bcp47='+kbd.match.tag+embed_query_x : embed_query_q));
300309
}
301310

302311
if(kbd.isDedicatedLandingPage) {

0 commit comments

Comments
 (0)