.htaccess переписать регулярное выражение: сопоставить что угодно, кроме "индекса" - PullRequest
10 голосов
/ 10 октября 2009

Я пытаюсь создать правило, используемое в файле .htaccess для соответствия чему угодно, кроме конкретной строки, в данном случае: index.

Я думал, что сначала можно сопоставить эту специальную строку и использовать [L], но это не работает,
и это должно быть возможно с помощью следующего регулярного выражения, но это вызывает ошибку 500.

Я хочу соответствовать:

  • pagename1
  • pagename2 / все
  • pagename3 / 234 / все
  • о
  • контакт-нам

но не

  • Индекс / 123
  • Индекс / 124 / все

(кстати, "индекс" - это имя файла без расширения, не мой выбор, это рабочая вещь)

^(?!index)[\w/\-]+

Я предполагаю, что реализация регулярного выражения в Apache не справляется с правилом (?!xxx).

Любая помощь / предложения будут высоко оценены.

Ответы [ 3 ]

16 голосов
/ 10 октября 2009

Вы можете использовать RewriteCond s для этого, например:

RewriteCond %{REQUEST_URI} !^index
RewriteRule (.*) index.php?what=$1

Это перезапишет каждый URL, который не начинается с индекса. Если вы хотите, чтобы в любом месте URL этого не было, удалите ^

4 голосов
/ 10 октября 2009

(Пожалуйста, прочитайте комментарии. Я сомневаюсь в этом, и я никогда не сталкивался с проблемами, хотя он дает намного более чистые .htaccess файлы, но: использование RewriteCond может предпочтительнее использования RewriteRule с чертой, из-за того, как наборы правил обрабатываются ?)

Просто используйте RewriteRule следующим образом, чтобы не перезаписать (тире), и остановить последующее переписывание ([L]) для всего, что начинается с index/:

# Do not rewrite anything that starts with index/
RewriteRule ^index/ - [L]

После этого сделайте любое переписывание, которое вам нравится.

Или, может быть, даже еще немного ограничим:

# Do not rewrite files, directories or symbolic links 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule . - [L]
1 голос
/ 10 октября 2009

Apache использовал три разные реализации регулярных выражений. Первым был System V8, начиная с Apache 1.3 они использовали POSIX ERE, а начиная с Apache 2 они использовали PCRE. И только PCRE поддерживает прогнозные утверждения. Поэтому вам нужен Apache 2, чтобы использовать это правило.

Но теперь к вашему вопросу. Если вы используете это правило:

RewriteRule ^index/ - [L]

все, что начинается с /index/, должно быть перехвачено этим правилом, и дальнейшее правило не должно применяться.

Но если это не сработает, попробуйте это:

RewriteRule !^index/ …

Опять же, это правило будет применяться к любому запросу, путь URL которого не начинается с /index/.

И если вы хотите получить что-либо из URL, используйте условие RewriteCond, чтобы проверить либо полный путь к URL (%{REQUEST_URI}), либо просто совпадение одной из ваших групп шаблонов:

RewriteCond %{REQUEST_URI} !^/index/
RewriteRule (.*) …
# or
RewriteCond $1 !^index$
RewriteRule ^([^/]+)/(.*) …
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...