.htaccess에서 <If> 지시문을 어떻게 사용해야합니까?


16

내 .htaccess 파일에서 Apache의 If 지시문을 사용하여 조건문을 추가하려고합니다.

이 페이지 http://httpd.apache.org/docs/trunk/mod/core.html#if를 참조 했지만 그다지 정교하지 않고 많은 예제를 제공합니다. 불완전한 두 가지 예는 다음과 같습니다.

<GET, HEAD, OPTIONS에 % {REQUEST_METHOD} 인 경우> 

<If "$ req {Host} = ''"> 

그래서 이것을 내 .htaccess 파일에 추가하려고했습니다.

<% {SERVER_PORT}가 GET, HEAD, OPTIONS 인 경우>
   # 아무것도 아직 없습니다
</ If>

그러나 페이지를로드하려고 할 때 오류 500이 계속 발생 합니다. 이것은 내 로컬 설치에 있으며 이전에 제대로 작동했습니다 (또는 해당 코드를 제거하면). 나는 믿습니다 AllowOverride All세계적으로 설정하고, 지시어가의 .htaccess에 존재하도록해야하는 경우에 대한 상황 ( ": 주 서버 설정, 가상 호스트, directory, .htaccess").

누군가 <If> 지시문을 올바르게 사용하는 방법에 대한 몇 가지 예 또는 왜 그것이 효과가 없는지에 대한 지침을 줄 수 있습니까?

감사!


1
500 오류가 발생하면 Apache가 오류 로그에 무언가를 기록했음을 의미합니다. 그것은 무엇을 말하는가? 또한, 대한 테스트 SERVER_PORTGET,HEAD,OPTIONS어떤 의미가 없다가 ( SERVER_PORT요청이 수신 된 번호 포트 번호를 될 것입니다).
larsks

고마워요. <If> 지시문을 지원하지 않는 아파치 2.0을 실행하는 것 같습니다. 아마도 2.3으로 업그레이드해야 할 수도 있습니다. 적어도 이것은 어디서나 예제가없는 이유를 설명합니다 (b / c 기능이 너무 새롭습니다). 충고 감사합니다.
cwd

답변:



16

<If> 는 Apache 2.4 이상에서만 사용할 수 있으므로 먼저 해당 버전이 있는지 확인하십시오.

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

대안 <If>

Apache 2.2에서 조건문을 수행하는 데 여전히 몇 가지 다른 솔루션이 있습니다.

  • 다음을 통해 환경 변수를 설정할 수 있습니다.

    • 아파치 설정
    • SetEnvIf
    • mod_rewrite 's RewriteMatch
  • 그런 다음을 사용하여 조건문을 수행 할 수 있습니다

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

예:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX

1
테스트했지만 작동하지 않습니다! 아파치 문서에서 <IfDefine>지시어는 시작시에만 구문 분석하고 parameter-name명령 프롬프트를 사용하여 전달할 수 있습니다.httpd -Dx=y
William Leung

귀하의 "대체 대안"이 저에게 잘 작동했습니다. 좋은 예입니다.
Kyborek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.