The following actions will also work:
ORDER BY expiry < CURRENT_DATE, abs(expiry - CURRENT_DATE)
However, this form will not use the index to create rows in the desired order. If your query benefits from this (selects the majority of the rows from the table or uses the limit), you need to use a join:
SELECT ... WHERE ... AND expiry >= CURRENT_DATE ORDER BY expiry UNION ALL SELECT ... WHERE ... AND expiry < CURRENT_DATE ORDER BY expiry DESC
source share