2011-11-09 2 views
0

내 상황이 여기에 있습니다. 나는 웹 루트와 여러 하위 디렉토리를 가지고, 이제 가정 해 봅시다 :Apache .htaccess RewriteRule

/var/www 
/var/www/site1 
/var/www/site2 

인해 특정 제한, 나는 하나 개의 도메인을 유지하고이 같은 별도의 폴더를 가지고 할 수있는 능력이 필요합니다. 이것은 나를 위해 잘 작동하지만 두 사이트 모두에서 많은 JS 및 CSS 참조는 같은 것들을 가리 :이 파일이 절대적으로 참조되기 때문에, 그들은 'JS'와 'CSS'디렉토리를 찾고 있습니다

"/js/file.js" 
"/css/file.css" 

/var/www는 물론 존재하지 않습니다. RewriteRules를 사용하여 절대적으로 참조 된 파일에 대한 요청을 올바른 하위 디렉토리로 리디렉션 할 수 있습니까? 심지어 하나의 디렉토리로 리디렉션, 말할 것도없고 사이트 1과 사이트 2 모두를 처리,

RewriteEngine on 
RewriteRule ^/$ /site1 

또는

RewriteEngine on 
RewriteRule ^/js/(.*)$ /site1/js/$1 
RewriteRule ^/css/(.*)$ /site1/css/$1 

그러나이 작품의도 : 내가 좋아하는 일을 시도했다. 내가 뭘 하려는지?

편집 : 솔루션

내 상황에 맞게 존의 조언을 적응 끝났다. 새 서브 디렉토리가 추가되거나 제거 될 때마다 .htaccess 파일을 프로그램 적으로 변경하는 기능이 있습니다. 내가 원하는 각 "사이트"를 위해, 나는 내 htaccess로에서 다음과 같은 부분이 있습니다

RewriteCond %{REQUEST_URI} !^/$ 
RewriteCond %{REQUEST_URI} !^/index.php$ 
RewriteCond %{HTTP_COOKIE} sitename=site1 
RewriteCond %{REQUEST_URI} !^/site1/ 
RewriteRule ^(.*)$ /site1/$1 [L] 

Index.php는 내 모든 사이트를 나열하는 파일은 "사이트 이름"쿠키 삭제, 그리고 쿠키를 설정 특정 사이트를 선택하면 "sitename = site #"이 표시됩니다. 요청이/

  • 을 위해하지 않으면 요청이 /index.php
  • 을 위해하지 않으면 요청이 "사이트 이름 = 사이트 개발"
  • 요청하면 쿠키가 포함되어있는 경우 내 RewriteConds는

    1. 을 확인 "/ site1 /"로 시작하지 않습니다.

    이러한 조건이 모두 충족되면 요청 전에 "/ site1 /"앞에 추가되도록 요청이 다시 작성됩니다. 세 번째 조건에서 "site1"대신 (\ w +) 일치하는 Conds/Rules의 단일 집합을 가지고 시도한 다음 네 번째 조건과 규칙에서 % 1을 참조했지만 작동하지 않았습니다. 나는 이것을 포기하고 정착했다.

  • 답변

    1

    RewriteRules가 .htaccess 파일에있는 경우 일치 항목에서 선행 슬래시를 제거해야합니다 (Apache가 mod_rewrite로 보내기 전에이를 제거해야합니다). 이게 효과가 있니?

    RewriteEngine on 
    RewriteRule ^js/(.*)$ /site1/js/$1 
    RewriteRule ^css/(.*)$ /site1/css/$1 
    

    편집 : 주석 해결하려면 다음을

    예, 작동하지만 내가 RewriteRule ^(.*)$ /site1/$1을 수행 할 때, 그것은 내부 서버 오류를 발행 할 아파치됩니다. 하지만 나에게 그것은 마치 개인적인 규칙의 일반적인 동등한 것 같아요!/something//site/something/에 다시 도착 때 규칙과 무슨 일

    이며, 아파치는 내부적 등

    당신이 필요로하는 것, 다시, 다시 /site/site/something/에, 다시을 을 다시 가져옵니다 리디렉션 그 조건을 추가하기 위해, 뭔가 같은 :

    RewriteCond %{REQUEST_URI} !^/site/ 
    RewirteRule ^(.*)$ /site/$1 [L] 
    
    작동
    +0

    예,하지만 난'RewriteRule의 작업을 수행 할 때^$가/사이트 개발/$ 1 ', 그것은 내부 서버 오류를 발행 할 아파치의 원인 (*.). 하지만 나에게 그것은 마치 개인적인 규칙의 일반적인 동등한 것 같아요! – denaje

    +0

    내 편집을 참조하십시오. 루핑 문제를 해결합니다. –

    +0

    아, 그건 의미가 있습니다. 이것은 한 사이트에서 작동하지만 둘 이상을 지원하려면 어떻게해야합니까? 추가 조건으로 'RewriteCond % {HTTP_REFERER}/site /'를 추가하여 요청을 다시 작성하기 전에 REFERER를 확인하려고했습니다. 그러나 /page1.htm에 대한 링크를 클릭하면 내부적으로 /site/page1.htm에 다시 작성되었지만 URI로 /page1.htm이 여전히 표시되기 때문에 첫 페이지를 지나면이 작업이 수행되지 않습니다. 그러면 두 번째 링크를 클릭 할 때 REFERER가 올바르지 않으며 다시 쓰기 규칙이 적용되지 않습니다. 어떤 제안? – denaje

    0

    다시 작성 규칙을 사용하여 서버 수준의 절대 링크가 중앙 사이트 호스팅 계정에 대한 기호 링크를 따라갈 수 있도록 symlinks을 설정해야합니다.