diff --git a/IPython/html/base/handlers.py b/IPython/html/base/handlers.py
index a08c4c7..2643c2c 100644
--- a/IPython/html/base/handlers.py
+++ b/IPython/html/base/handlers.py
@@ -463,8 +463,9 @@ class FilesRedirectHandler(IPythonHandler):
 # URL pattern fragments for re-use
 #-----------------------------------------------------------------------------
 
-path_regex = r"(?P<path>.*)"
-notebook_path_regex = r"(?P<path>.+\.ipynb)"
+# path matches any number of `/foo[/bar...]` or just `/` or ''
+path_regex = r"(?P<path>(?:(?:/[^/]+)+|/?))"
+notebook_path_regex = r"(?P<path>(?:/[^/]+)+\.ipynb)"
 
 #-----------------------------------------------------------------------------
 # URL to handler mappings
diff --git a/IPython/html/tests/test_paths.py b/IPython/html/tests/test_paths.py
new file mode 100644
index 0000000..18dc4ad
--- /dev/null
+++ b/IPython/html/tests/test_paths.py
@@ -0,0 +1,61 @@
+
+import re
+import nose.tools as nt
+
+from IPython.html.base.handlers import path_regex, notebook_path_regex
+
+try: # py3
+    assert_regex = nt.assert_regex
+    assert_not_regex = nt.assert_not_regex
+except AttributeError: # py2
+    assert_regex = nt.assert_regexp_matches
+    assert_not_regex = nt.assert_not_regexp_matches
+
+
+# build regexps that tornado uses:
+path_pat = re.compile('^' + '/x%s' % path_regex + '$')
+nb_path_pat = re.compile('^' + '/y%s' % notebook_path_regex + '$')
+
+def test_path_regex():
+    for path in (
+        '/x',
+        '/x/',
+        '/x/foo',
+        '/x/foo.ipynb',
+        '/x/foo/bar',
+        '/x/foo/bar.txt',
+    ):
+        assert_regex(path, path_pat)
+
+def test_path_regex_bad():
+    for path in (
+        '/xfoo',
+        '/xfoo/',
+        '/xfoo/bar',
+        '/xfoo/bar/',
+        '/x/foo/bar/',
+        '/x//foo',
+        '/y',
+        '/y/x/foo',
+    ):
+        assert_not_regex(path, path_pat)
+
+def test_notebook_path_regex():
+    for path in (
+        '/y/asdf.ipynb',
+        '/y/foo/bar.ipynb',
+        '/y/a/b/c/d/e.ipynb',
+    ):
+        assert_regex(path, nb_path_pat)
+
+def test_notebook_path_regex_bad():
+    for path in (
+        '/y',
+        '/y/',
+        '/y/.ipynb',
+        '/y/foo/.ipynb',
+        '/y/foo/bar',
+        '/yfoo.ipynb',
+        '/yfoo/bar.ipynb',
+    ):
+        assert_not_regex(path, nb_path_pat)