Number four, but with two join tables might be best.
Have a widget table, a widget_url, and widget_store table.
Then, if the widget is store at an URL, you use it's id in the widget_url table, and a simple join against that table returns just the widgets with url storage. Same for the store table.
select * from widget, widget_url where widget.id=widget_url_wid;
Since the relation is formed by the widget id being the in the secondary tables, if (or when???) you need to keep track of both a web page AND a warehouse location, you can do both easily with no changes to your database.