Apache mod_rewrite 규칙 순서 혼란

Apache mod_rewrite 규칙 순서 혼란

저는 경로 및 쿼리 문자열의 비트를 기반으로 이전 버전의 사이트에서 URL을 다시 작성하는 몇 가지 간단한 규칙을 설정하려고 합니다.

처음에는 다음과 같이 보였습니다.

RewriteEngine on

RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?

이는 의 /free_item.php결과를 적절하게 대체하여 URL 에 대해 잘 작동하는 것처럼 보였지만 URL은 리디렉션된 URL의 첫 번째 부분만 반환하고 조회 결과는 제외했습니다 . 규칙의 순서를 바꾸면 실패한/작동하는 URL이 바뀌었습니다. 구문을 항상 이해하고 있으므로 URL 경로가 패턴과 일치하지 않으면 규칙을 건너뛰고 다음 규칙으로 처리가 진행됩니다. 이 경우,RewriteMap/item.phpRewriteMapRewriteRule

마침내 두 블록으로 나누어서 작동하게 만들었습니다.

RewriteEngine on

RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?

첫 번째 기술이 실패한 이유를 알려줄 수 있는 사람이 있나요?

편집하다:테스트로 두 번째 RewriteRule. 첫 번째 규칙이 아닌 두 번째 규칙과 일치해야 하는 URL을 요청하면 해당 경로 요소가 예상대로 나타납니다. 조회 결과가 아닙니다 RewriteMap.

감사해요!

-벤

답변1

첫 번째 기술이 실패한 이유는 두 번째 RewriteRule의 RewriteCond %1 역참조가 존재하지 않기 때문입니다. 각 RewriteRule에는 자체 RewriteCond 세트가 있으며 RewriteCond를 다른 RewriteRule 블록과 공유하지 않습니다.

보다:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#InternalRuleset

또한 각 규칙이 독립적으로 나타나는 것처럼 [L] 플래그를 추가하는 것이 좋습니다. 예:

RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}? [L]

RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}? [L]

행운을 빌어요 :)

관련 정보