mod_rewrite RewriteRule проблемы if-then-else - PullRequest
2 голосов
/ 14 января 2011

Моя конфигурация Apache использует mod_rewrite для вызова внешнего приложения (используя RewriteMap prg) для перезаписи URL.Это отлично работает.Мне нужно обработать граничные условия, где URL-адрес запроса не совпадает с искомым URL-адресом.Кроме того, внешнее приложение возвращает ошибку, нам нужно перенаправить на страницу ошибки.

Вот код:

RewriteMap forwardURL "prg:\"C:/Program Files/Java/jdk1.6.0_11/bin/java.exe\" -jar \"C:/app/Mapper.jar\""

RewriteLock bin\map.sub.lock

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/SomeScript.asp(.*)$ ${forwardURL:%{QUERY_STRING}}
RewriteRule ^/error(.*)$ /error.html [L]

RewriteRule ^(.*)$ - [F]

Когда мы получаем запрос для нашего старого сценария ASP (SomeScript.asp), приложение Java вызывается для поиска правильного URL.Он либо вернет правильный URL, либо "/ error".Если возвращается «/ error», мы хотим, чтобы RewriteRule изменил его на страницу ошибки.Таким образом, правила 1 и 2 связаны между собой.Если правило 1 выполняется, правило 2 должно выполняться.Если правило 1 и правило 2 совпадают, то правило 3 не должно выполняться.Правило 3 - это правило «поймай все», которое возвращает ошибку 403 «Запрещено».

Приведенный выше код близок, но не совсем там.Всеобщее последнее правило - это слишком много.Если правило 1 соответствует, то правило 3 также поймает его и вернет 403.

Как мы можем написать это так, чтобы правила 1 и 2 работали, как указано выше, но если они не совпадают, ошибка 403вернулся?

Спасибо

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Вот что мы в итоге сделали: мы избавились от второй строки и изменили приложение java, чтобы оно возвращало URL файла ошибки. Все, что не совпадает с первой строкой, попадает в последнюю строку и отвечает сообщением Запрещено. То, что мы связывали, вероятно, невозможно с логикой mod_rewrite.

RewriteMap forwardURL "prg:\"C:/Program Files/Java/jdk1.6.0_11/bin/java.exe\" -jar \"C:/app/Mapper.jar\""

RewriteLock bin\map.sub.lock

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/SomeScript.asp(.*)$ ${forwardURL:%{QUERY_STRING}} [L]
RewriteRule ^(.*)$ - [F]

И затем мы решили, что узкое место одного приложения Java ответило на вопрос о перезаписи, было слишком много, и преобразовали его в сервлет, работающий под управлением Tomcat. Таким образом, мы получаем гораздо лучшую производительность, а также можем полностью контролировать заголовки ответов. Регилеро дал толчок за попытку.

1 голос
/ 15 января 2011

Используйте флаги [L] , эти флаги означают остановка процесса перезаписи, если найдено совпадение .Поэтому добавьте этот тег для 1-го и второго тега.

редактировать -

слишком быстро; вам необходимо добавить также [C] помечает 1-е правило, чтобы оно связывалось со вторым правилом, при этом 2-е правило запускается, если 1-е совпадение.Только второму требуется [L]

end edit -

О программе rewriteMap, в документации по apache запросить 'NULL' в случае несоответствия - не «ошибка».

И если у вас еще есть вопрос по переписыванию модов и вы боитесь документации перезаписи модов apache, проверьте эту превосходную на servfault:-ever-хотел к ноу-о-мод-перезаписи-правила, но, были-боятся к спрашивать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...