Регулярное выражение для чистых URL - PullRequest
0 голосов
/ 06 августа 2010

Чистые URL-адреса кажутся довольно простыми, но мне нужна особая ситуация. Я хотел бы иметь возможность включать суффикс .html или вообще ничего, но не любое другое расширение:

someurl = pass
someurl/somepage = pass
someurl.html = pass
someurl/somepage.html = pass

someurl.css = fail
someurl.exe = fail
someurl.anyotherextension = fail
someurl/someother.ext = fail

Возможно ли это? Должен ли я как-то исключить расширения, которые мне не нужны?

Edit:

Пока что ни один из ответов не работает. Единственное, что я обнаружил самостоятельно, это работает:

^/([\w]*(.html)?)$
но он не будет работать с косой чертой в URL. Добавление косой черты в скобки класса символов приводит к сбою.

Ответы [ 5 ]

0 голосов
/ 07 августа 2010

Вместо того, чтобы пытаться использовать регулярное выражение для сопоставления URL-адресов, которые вы хотите разрешить (как и другие ответы, похоже, пытаются), используйте регулярное выражение для сопоставления URL-адресов, которые вы хотите заблокировать:

\.(?!html$)[^./]*$

Это регулярное выражение соответствует расширению URL, если только расширение .html.URL-адреса без расширения или .html не совпадают.Ваши примеры не включают URL-адреса с запросами (?param=value) или фракциями (#anchor), поэтому регулярное выражение не учитывает их.Я также предполагаю, что ваш regex аромат поддерживает lookahead .

0 голосов
/ 06 августа 2010

Параметр регулярного выражения для чистых URL с расширением .html:

^/([\w\/]*(\.html)?)$

Полная строка lighttpd.conf:

url.rewrite = ( "^/([\w\/]*(\.html)?)$" => "index.php?page=$1" )

Быстрое напоминание: должны быть указаны абсолютные пути к файлам или базовая ссылкабыть реализовано на любых страницах, которые передают это регулярное выражение.

0 голосов
/ 06 августа 2010
/\.html$|(?:^|.*\/)[^\.]+$/

заканчивается на ".html" или не имеет "." от начала URL или до последнего / до конца (вы можете иметь папки, содержащие ".")

0 голосов
/ 06 августа 2010

Как насчет этого?

(^[^\.]+?$)|(^.+?\.html$)

Это соответствует либо строке, которая не содержит ., либо строке, которая заканчивается на .html.

Или используйте это, если вы хотите использовать точки в именах "папок":

(^.+?/[^\.]+?$)|(^.+?\.html$)

Соответствует либо строке, которая не содержит . после последнего /, либо строке, которая заканчивается на .html.

0 голосов
/ 06 августа 2010

Попробуйте это:

(?:^|/)[^./]+(?:\.html)?$

Перевод: начиная с последнего /, если есть один (или с начала строки, если нет) совпадение с одним или несколькими элементами, кроме / или., опционально завершается .html.

...