
나는 다음과 같은 규칙을 가지고 있습니다:
RewriteCond %{REQUEST_URI} ^/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteCond %{REQUEST_URI} !^/guide/(.*)$
RewriteRule ^(.*)$ /home/neezer/public-html/domain.com/guide/$1 [L]
그 자체로는 훌륭하게 작동합니다. 기본적으로 "/guide" 폴더에 보관하고 싶은 파일이 잔뜩 들어 있는 디렉토리가 많지만 SEO 이유로 인해 해당 파일이 웹 루트에 표시되기를 원합니다.
이 규칙은 작동하지만 안타깝게도 원래 URL도 여전히 작동합니다("/guide" 사용). 실제로 서버의 파일을 이동하지 않고 URL에 "/guide"가 있는 항목을 없는 항목으로 301 리디렉션하고 싶습니다.
이 규칙을 추가해 보았습니다.
RewriteCond %{REQUEST_URI} ^/guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteRule ^guide/(.*)$ http://www.domain.com/$1 [R=301,L]
...하지만 그것은 내 첫 번째 규칙을 완전히 어겼습니다.
내가 뭘 잘못하고 있는지에 대한 생각이 있나요? 이 문제를 해결하는 데 도움이 필요한 다른 정보가 있으면 알려주시기 바랍니다.
편집: Matthews의 제안에 따라 규칙을 다음과 같이 변경했습니다(원하는 동작을 반영).
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$1-apartments/$2 [R=301,L]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$1-apartments/$2 [L]
그러나 이번에는 다른 방식으로 규칙이 여전히 서로를 깨뜨리고 있습니다. 두 번째 규칙이 적용되는 페이지(및 첫 번째 규칙이 올바르게 리디렉션되는 페이지)에 액세스하려고 하면 Safari에서 다음 오류가 발생합니다.
'을(를) 열려고 할 때 리디렉션이 너무 많이 발생했습니다.http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php". 다른 페이지를 열기 위해 리디렉션된 페이지를 열었다가 다시 원래 페이지를 열기 위해 리디렉션되는 경우 이러한 현상이 발생할 수 있습니다.
어떤 제안이 있으십니까?
추가 편집:
이러한 규칙은 스스로 반복되는 것 같습니다. 다음은 재작성 로그에서 발췌한 내용입니다.
init rewrite engine with requested uri /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
pass through /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] rewrite 'manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> '/home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php'
[perdir /home/neezer/public-html/domain.com/] strip document_root prefix: /home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php -> /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] internal redirect with /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [INTERNAL REDIRECT]
init rewrite engine with requested uri /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
pass through /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] rewrite 'guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> 'http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php'
[perdir /home/neezer/public-html/domain.com/] explicitly forcing redirect with http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] escaping http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php for redirect
[perdir /home/neezer/public-html/domain.com/] redirect to http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [REDIRECT/301]
문제는 중간 섹션(줄 바꿈으로 구분)에 있다고 생각합니다. Apache가 (을 사용하여) 로컬 경로를 다시 작성한 후 /home/neezer/...
문서 루트가 제거된 또 다른 요청을 발행합니다. 물론 여기에는 가 포함됩니다. 그런 /guide
다음 첫 번째 규칙을 필터링하고 결국 두 번째 규칙을 필터링하고 무한대로 앞뒤로 이동합니다. .
첫 번째 규칙 이후에 단순히 중지하도록 어떻게 지시합니까? 추가해도 [L]
아무런 효과가 없는 것 같습니다.
답변1
왜 RewriteConds를 사용하고 있는지 잘 모르겠습니다. RewriteRules에 모든 것을 직접 넣을 수 있을 것 같습니다. Request_URI와 일치하는 모든 항목을 리디렉션한다는 사실 때문에 문제가 발생한 것 같습니다. RewriteRule 자체에서 일치를 수행하면 다시 작성된 규칙은 더 이상 다음 규칙과 일치하지 않습니다.
다음과 같은 것을 시도해 볼 수도 있습니다.
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$2
당신이 달성하려는 모든 것을 이해하지 못하기 때문에 아마도 이것을 조정해야 할 것입니다. 예를 들어 아래 RewriteCond는 중복된 것 같아서 생략했습니다. 가이드 디렉토리 아래의 모든 내용을 실제로 다시 작성하려는 경우 이를 다시 통합해야 합니다.
RewriteCond %{REQUEST_URI} !^/guide/(.*)$
편집하다
내 서버에서 몇 가지 간단한 테스트를 수행한 후 이러한 규칙이 작동하도록 할 수 있었지만 디렉터리별 컨텍스트에서는 작동하지 않았습니다(예: .htaccess 또는 내부에서 작동하지 않음 <Directory></Directory>
).
나는 이것을 테스트하지 않았지만 두 번째 규칙으로 evironrnment 변수를 설정한 다음 첫 번째 규칙에서 테스트하여 이 문제를 해결할 수 있습니다.
RewriteCond %{ENV:REDIRECT} !^NO$
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ [E=REDIRECT:NO]
답변2
어쨌든 무한 루프 주변을 찾을 수 없었기 때문에 파일을 "neighborhoods"라는 새 폴더로 이동하고 다음 규칙을 사용했습니다.
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$1-apartments/$2 [R=301,L]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/neighborhoods/$1-apartments/$2 [L]
이상적이지는 않지만 이제 두 개의 폴더(가이드에서 제공하는 다른 파일이 있음)가 있기 때문에 SEO 문제가 해결됩니다.