diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 01d3c050a..5f62f3f34 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -2164,18 +2164,37 @@ INFO is a plist holding contextual information. See
(raw-path (org-element-property :path link))
;; Ensure DESC really exists, or set it to nil.
(desc (and (not (string= desc "")) desc))
- (path (cond
- ((member type '("http" "https" "ftp" "mailto"))
- (concat type ":" raw-path))
- ((string= type "file")
- ;; Treat links to ".org" files as ".html", if needed.
- (setq raw-path (funcall --link-org-files-as-html-maybe
- raw-path info))
- ;; If file path is absolute, prepend it with protocol
- ;; component - "file://".
- (if (not (file-name-absolute-p raw-path)) raw-path
- (concat "file://" (expand-file-name raw-path))))
- (t raw-path)))
+ (path
+ (cond
+ ((member type '("http" "https" "ftp" "mailto"))
+ (concat type ":" raw-path))
+ ((string= type "file")
+ ;; Treat links to ".org" files as ".html", if needed.
+ (setq raw-path
+ (funcall --link-org-files-as-html-maybe raw-path info))
+ ;; If file path is absolute, prepend it with protocol
+ ;; component - "file://".
+ (when (file-name-absolute-p raw-path)
+ (setq raw-path
+ (concat "file://" (expand-file-name raw-path))))
+ ;; Add search option, if any. A search option can be
+ ;; relative to a custom-id or a headline title. Any other
+ ;; option is ignored.
+ (let ((option (org-element-property :search-option link)))
+ (cond ((not option) raw-path)
+ ((eq (aref option 0) ?#) (concat raw-path option))
+ ;; External fuzzy link: try to resolve it if path
+ ;; belongs to current project, if any.
+ ((eq (aref option 0) ?*)
+ (concat
+ raw-path
+ (let ((numbers
+ (org-publish-resolve-external-fuzzy-link
+ (org-element-property :path link) option)))
+ (and numbers (concat "#sec-"
+ (mapconcat 'number-to-string
+ numbers "-")))))))))
+ (t raw-path)))
attributes protocol)
;; Extract attributes from parent's paragraph.
(and (setq attributes