2015-08-24 4 views
0

Я собираюсь реализовать решение переадресации «довольно переписать» через htaccess и mod_rewrite. То, что я хочу, чтобы достичь является следующее:mod_rewrite исключить несколько слов

example.com/test123 --> example.com/page.php?c=test123 

Это легко сделать с помощью одного RewriteRule:

RewriteRule ^(.*) page.php?c=$1 [L,NC] 

Но я хочу, чтобы исключить некоторые URLs:

  • / (I» у меня есть определенный index.php, который я не хочу переписывать)
  • css/(.*)
  • images/(.*)
  • CMS/(.*)
  • js/(.*)
  • contact/(.*)
  • prijslijst/(.*)
  • werk/(.*)

Я пробовал некоторые регулярные выражения, но до сих пор с безрезультатно. Мне нужна помощь, чтобы убедиться, что перечисленные каталоги не переписываются, но любое другое ключевое слово переписывается.


Некоторые вещи, которые я пробовал:

следующие выдержки отменить любую перезапись:

Первый:

RewriteCond %{QUERY_STRING} "^!prijslijst/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "^!werk/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "^!js/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "^!css/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "^!CMS/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "^!images/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "^!contact/{0,1}(.*)" 
RewriteRule ^(.*) page.php?c=$1 [L,NC] 

Второй:

RewriteCond %{QUERY_STRING} "^!(prijslijst|werk|js|css|CMS|images|contact)/{0,1}(.*)" 
RewriteRule ^(.*) page.php?c=$1 [L,NC] 

Третий:

RewriteRule ^!(prijslijst|werk|js|css|CMS|images|contact)/{0,1}(.*) page.php?c=$1 [L,NC] 

Незначительная регулировка верхней один в результате все переписываются, даже то, что я хотел бы исключить:

RewriteCond %{QUERY_STRING} "!prijslijst/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "!werk/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "!js/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "!css/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "!CMS/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "!images/{0,1}(.*)" 
RewriteCond %{QUERY_STRING} "!contact/{0,1}(.*)" 
RewriteRule ^(.*) page.php?c=$1 [L,NC] 

(^ был удалены с начала каждого второго параметра RewriteCond)


EDIT

Я представил ответ на мой собственный, чтобы документировать окончательное решение. Ответ @ ndn оказал большое влияние, это дало мне толчок в правильном направлении. Большое спасибо!

ответ

0

Мое решение (с благодаря @ndn)

@ndn дал мне отправную точку, чтобы найти правильное решение. Я хотел бы поблагодарить его за то, что он дал мне указатель в правильном направлении!

В конце концов, я уменьшил количество RewriteCond. В отличие от @ndn, запрошенного, я не занимался отрицательным регулярным выражением в RewriteRule. Я думаю, что это дает лучший обзор для использования RewriteCond с для ограничения перезаписи, но это можно сделать как в RewriteRule, так и в RewriteCond, это вопрос предпочтения.

И что же мне в итоге получилось? Вот оно:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /ut-taertje/ 
RewriteCond %{REQUEST_URI} !^/ut-taertje/(?:.{0}$|css|CMS|js|images|prijslijst|contact|werk)(?:$|/.*)?$ 
RewriteCond %{REQUEST_URI} !^/ut-taertje/(?:page\.php|index\.php)$ 
RewriteRule ^(.*)$ page.php?c=$1 [L,NC] 
</IfModule> 

Я объясню это в ближайшее время. Я не включил RewriteBase в вопрос, но учитывая тот факт, что он играет роль в RewriteCond, это прояснит его лучше. Замените подкаталог /ut-taertje/ на /, чтобы применить его к корню.

Поэтому я поставил свои ограничения на переписывание на два RewriteCond. Верхняя часть представляет собой группу регулярных выражений, чтобы исключить различные каталоги, которые я хотел исключить. Обратите внимание, что группа включает .{0}$, так как она также должна исключать корень самого каталога, который не имеет ничего после ведущего / URI запроса. Кроме того, у меня есть вторая группа регулярных выражений ((?:$|/.*)?), которая позволяет мне исключать не только сами каталоги, но и все, что приходит после косой черты (не только js/, но и js/codebase.js или js/jquery/).

Вторым RewriteCond является исключение случая кромки. При тестировании я использовал перенаправления 301, а не «невидимые» перенаправления. Оказалось, что переписывание на page.php?c=<the original request URI> вызвало бесконечный цикл запросов перенаправления с сервера. Зачем? Потому что это не было частью исключения с первого RewriteCond!

Вот и все. RewriteRule довольно прост, он перезаписывает все, что передает условные фильтры от RewriteCond.

3
RewriteRule ^(?!/$|css/|images/|CMS/|js/|contact/|prijslijst/|werk/)(.*) page.php?c=$1 [L,NC] 

В принципе, я просто взял оригинал переписывают и добавил отрицательный предпросмотр для списка вещей, которые вы хотели пропускаемых (?!/$|css/|images/|CMS/|js/|contact/|prijslijst/|werk/).

+0

Этот ответ сработал для меня. Благодаря! – Jeroen

+0

С другой стороны, что-то еще не работает. Это '/ $', который еще не соблюдается. Это означает, что 'example.com /' по-прежнему перенаправляется на example.com/page.php'. Все остальные исключаются, поэтому часть работает нормально (css, images и т. Д.). – Jeroen

+0

@Jeroen, не могли бы вы попробовать заменить '/ $' на '/? $'? – ndn