
저는 경로 및 쿼리 문자열의 비트를 기반으로 이전 버전의 사이트에서 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.php
RewriteMap
RewriteRule
마침내 두 블록으로 나누어서 작동하게 만들었습니다.
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]
행운을 빌어요 :)