모든 가상 호스트에 적용되는 Apache에서 글로벌 rewritecond / rewriterule을 구현하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/344588

  •  19-08-2019
  •  | 
  •  

문제

제목은 거의 모든 것을 말합니다. :-) 가상 호스트가 많고 요청이 어떤 가상 호스트를 지시 할 수 있는지에 관계없이 URL을 다시 작성하는 httpd.conf 파일의 상단에 단일 재 작성 블록을 넣고 싶습니다. 도대체 어떻게해야합니까?

나는 찾았다 이것 그러나 내 질문은 동일합니다. .htaccess 파일에 의지하지 않고 각 가상 호스트에 대해 다른 작업을 수행하지 않고 어떻게해야합니까?

OMGTIA!

도움이 되었습니까?

해결책

지정하십시오 RewriteOptions InheritDown 학부모 범위 (예 : httpd.conf)에서 규칙을 수정하지 않고 자식 가상 호스트에 적용됩니다.

이것은 가상 호스트에서만 작동합니다 RewriteEngine 지침이 설정됩니다 on:

재 작성 구성은 가상 호스트에 의해 상속되지 않습니다. 즉, 재 작성 규칙을 사용하려는 각 가상 호스트에 대한 지시문에 대한 RewriteEngine이 필요합니다.

(원천)

Apache는 2.4.8 (원래 질문의 시점에서는 사용할 수 없음) 이후이를 지원합니다.

문서에서 RewriteOptions:

상속

이 옵션이 활성화되면 모든 하위 구성이 현재 구성의 구성을 상속합니다. 모든 어린이 구성에 상속되는 RewriteOptions를 지정하는 것과 같습니다. 부모-자식 관계를 처리하는 방법에 대한 자세한 내용은 상속 옵션을 참조하십시오. Apache HTTP Server 2.4.8 이상에서 사용할 수 있습니다.

전속

위의 상속과 마찬가지로, 현재 범위의 규칙은 모든 아동의 범위에 지정된 규칙에 적용됩니다. Apache HTTP Server 2.4.8 이상에서 사용할 수 있습니다.

무시하십시오

이 옵션은 현재 및 자식 구성이 상속 또는 상속을 지정하는 부모로부터 상속 될 모든 규칙을 무시하도록 강요합니다. Apache HTTP Server 2.4.8 이상에서 사용할 수 있습니다.

(http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions)

다른 팁

기본적으로 기본 서버 컨텍스트의 mod_rewrite 구성 설정은 가상 호스트에 의해 상속되지 않습니다. 기본 서버 설정을 가상 호스트에 적용하려면 각 지시 사항을 각각에 배치해야합니다. <VirtualHost> 부분:

RewriteEngine On
RewriteOptions Inherit 

딸깍 하는 소리 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html 자세한 정보를 찾으려면

가능한 가장 간단한 솔루션은 추가하는 것 같습니다

RewriteOptions inherit

각 VirtualHost 지시문에. 이것은 .htaccess 파일을 엉망으로 만드는 것보다 훨씬 간단합니다. 아파치는 그 사실에 대해 매우 분명합니다

기본적으로 재 작성 구성은 상속되지 않습니다. 즉, 사용하려는 각 가상 호스트에 대한 지침에 다시 작성해야합니다. (http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html)

그리고 분명히 기본값을 변경하는 방법은 어린이 (vhost 또는 감독)의 RewriteOptions를 통해 이루어 지므로해야합니다. 무엇 각 어린이에게.

나는 그것을 테스트 한 적이 없으므로 작동하지 않을 수도 있지만 추가하려고합니다. include 모든 가상 호스트에서 단일 파일로 지시됩니다. 각 가상 호스트 구성 블록을 한 번 변경해야하지만 그 후에는 변경할 중앙 위치가 있어야합니다. ymmv.

이름의 도메인 부분에 무언가를 다시 쓰려고하는 경우, 예를 들어 일반적인 철자를 수정하려면 '상속'옵션이 필요하지 않습니다. 이름없는 가상 호스트를 설정하여 모든 유효하지 않은 호스트 이름을 잡고 리디렉션하기 전에 올바르게 respell.

이것은 리디렉션을 사용하기 때문에 다시 쓰기가 적용된 후에 적절한 가상 호스트를 찾을 수 있습니다.

Options +Indexes +FollowSymLinks
RewriteEngine on
# If it begins with only domain.com, prepend www and send to www.domain.com
RewriteCond %{HTTP_HOST} ^domain [NC]
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301]

# Correct misspelling in the domain name, applies to any VirtualHost in the domain
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC]
RewriteRule ^(.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301]

# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them
<VirtualHost *>
    RewriteEngine on
    RewriteOptions inherit
</VirtualHost>

나는 항상 ......

Listen 80
NameVirtualHost *:80

<VirtualHost *:80>
ErrorLog "/var/log/apache2/error_log"
</VirtualHost>

<VirtualHost *:80>
ServerName alloftherestoftheVHosts.com
DocumentRoot "/ServiceData/.........
............ 

그리고 그것은 항상입니다 보였다 작동하기 위해 ... 오류 로그가 올바르게 결합되고 있습니다.

개인 메모 .. Apache 구성 스키마와 구문을 꿈꾸는 사람은 Dingbat 또는 동굴에서 너무 많은 시간을 보낸 Dingbats 그룹이었습니다. 둘 다 크게 다르지만 ... Hello-Kitty 설정 프로세스 체로키.. 악의적으로 간결합니다 nginx 구성 .... 둘 다 훨씬 더 논리적입니다 ..

vhost에 더 많은 쓰레기를 추가하지 않아도 상속을 사용하고 싶을 수도 있습니다.

글로벌 letsencrypt 별칭의 예 :

# letsencrypt
<IfModule alias_module>
    Alias /.well-known/ /var/www/html/.well-known/
</IfModule>
<IfModule mod_rewrite.c>
    # prevent vhost rewrites from killing the alias
    RewriteEngine On
    RewriteOptions InheritDownBefore
    RewriteCond %{REQUEST_URI} ^/\.well\-known
    RewriteRule . - [L,PT]
</IfModule>

그런 다음 다른 지침없이 각 Vhosts 에서이 작업을 수행 할 수 있습니다.

<VirtualHost *:80>
    ....
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^/.*            /index.php [L,PT]
    </IfModule>
</VirtualHost>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top