2009-10-28 5 views
0

Каждое приведенное ниже правило отлично работает при использовании отдельно. Однако при совместном использовании поведение правил меняется.Изменение правил поведения при использовании вместе

Когда правило №2 используется само по себе, запрос для https://internal/Security/login переписывается Apache на сапфир/main.php без ведома браузера. Это ожидаемое поведение.

Когда оба набора правил используются вместе, запрос на упомянутый выше URL-адрес приводит к тому, что Apache отправляет 301 перенаправление на http://internal/sapphire/main.php?url=Security/login.

Почему Apache отправляет это перенаправление вместо внутреннего переписывания?

# Rule Set # 1 
# - Forces all HTTPS requests to HTTP, except for security section requests. 
# Example: request for https://internal/abc/ 
# -> redirected to http://internal/abc/ 
RewriteCond %{SERVER_PORT} =443 
RewriteCond %{REQUEST_URI} !^/Security($|/.*$) 
RewriteRule (.*) http://internal/$1 [R=301,L] 

# Rule Set # 2 
# - Hands request to CMS - web user does not see this behind-the-scenes rewrite 
RewriteRule (.*) sapphire/main.php?url=$1&%{QUERY_STRING} [L] 

ответ

1

L флаг вызывает закачка уже переписан URL. Поэтому попробуйте проанализировать исходный запрошенный URL:

RewriteCond %{SERVER_PORT} =443 
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /Security[/?\ ] 
RewriteRule (.*) http://internal/$1 [R=301,L] 
+0

Спасибо, Gumbo. Ваш ответ дал мне ключ, который мне нужен для решения этой проблемы. Я добавил эту строку в набор правил №1: RewriteCond% {REQUEST_URI}! ^/Sapphire/main.php $ –

Смежные вопросы