htaccess에서 어떤 순서 규칙이 적용됩니까?


9

이것이 간단한 예 또는 아니오 답변이기를 바랍니다 (이유를 지정하십시오)

Q1 : 규칙은 htaccess에서 어떤 순서로 중요합니까? 그것들은 완전히 분리 된 항목이기 때문에 : 예를 들어

Q2 : 그렇다면, 나는 올바른 순서를 적용하고 있습니까? htacces 엔진의 속도를 높이고 불필요한 규칙으로 과부하하지 않으려면?

Q3 : 여기서 비활성화 / 추가 할 내용에 대한 팁은 +1입니다!


# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /

#####################################################

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M172800
    Header unset ETag
    FileETag None
    Header unset Pragma

    ##### STATIC FILES
    <FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
        ExpiresDefault M1209600
        Header set Cache-Control "public, max-age=1209600"
    </FilesMatch>

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(php)$">
        ExpiresDefault M604800
        Header set Cache-Control "public, max-age=604800"
    </FilesMatch>
</IfModule>

#####################################################

#  /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$  /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

####################################################

# NO WWW   http://www. becomes always http://
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz

##############################################################

ErrorDocument 500 /
ErrorDocument 404 /

답변:


10

.htaccess 파일은 일반 Apache 구성 파일과 동일한 형식을 사용하므로 동일한 규칙이 적용됩니다.

대부분의 구성 설정은 순서에 의존하지 않지만 일부는 설정에 따라 다릅니다.

RewriteRuleRewriteCond예 그래서이 경우에서 대답이 YES이며, 순서에 민감하다.

예를 들어

http://wiki.apache.org/httpd/RewriteRule

이것들이 평가되는 순서에 대한 설명.


4

상관 있지. RewriteRule에 대한 문서 에서 인용 :

이러한 규칙이 정의 된 순서는 중요합니다. 이는 런타임에 적용되는 순서입니다.


1
mod_rewrite 내에서 중요합니다-예. 그러나 OP는 특별히 mod_rewrite를 다루지 않으며 OP .htaccess파일 에 다른 모듈의 다른 지시어가 많이 있습니다. 간단히 말해, 다른 모듈 (및 다른 컨테이너 )의 지시문 은 구성 파일의 명백한 순서에 관계없이 독립적으로 미리 정의 된 순서로 실행됩니다.
MrWhite

1

예를 들어 <files>vs 의 순서가 <Rewrite>성능에 어떤 영향을 미치는지 에 대해서는 말할 수 없습니다 . 나는 그것을 스스로 찾으려고 노력하고있다. 나는 이것에 대한 정보를 찾을 수 없었으므로 아마도 중요하지 않습니까 ??

그러나 나는 사람들이 기대할 수 있지만 Rewritevs Redirect(및 RedirectMatch) 사이 에서 실행 순서가 나열된 순서 아닐 수도 있음을 지적하고 싶습니다 .
구체적으로 mod_rewriteand 및 mod_alias모듈은 독립적으로 처리 / 실행됩니다. 순서.

  1. 모든 mod_rewrite 지시문 ( Rewrite)이 나열됩니다 (순서대로).
  2. THEN 모든 mod_alias가 지시어 ( RedirectRedirectMatch) 순서대로 실행하는 그들이 파일에 나열되어 있습니다.

따라서 a가 Redirect진행 되더라도 모든 다시 쓰기가 처리 된 후에Rewrite 만 리디렉션이 처리됩니다 .

리디렉션과 다시 쓰기가 모두있는 경우 파일을 "읽을 수있는"상태로 유지하는 한 가지 방법은 mod_alias모듈 을 전혀 사용하지 않는 것 입니다. 대신을 사용하십시오 mod_rewrite. [R] 플래그로 다시 쓰면 본질적으로 다시 쓰게됩니다.
이 웹 마스터의 답변 은 그 방법을 보여줍니다.

이제 모든 지시문이 파일에 표시된 순서대로 실행되므로 실행 순서에 대한 혼란이나 혼란이 없습니다. 양자 택일로, 당신은 할 수 물리적으로 모든 재배치 RedirectRedirectMatch그들이이 때까지 실행되지 않습니다 자신을 상기 시키도록, 파일의 "바닥"을 지시를 Rewrite어쨌든이야.

이 시점에서 깨달은 좋은 StackExchange 답변은 다음과 같습니다.

나머지 부분 은 예를 들어 s files전후 에 배치하는 성능에 대한 정보를 찾을 수 없었습니다 rewrite. 내가 찾은 유일한 성능 기반의 조언은, 하나의 서버 구성 파일에 액세스 할 수 있다면, 그것은 가능한 한 많이 이동하는 최선의 방법이다 에서 htaccess로 파일 설정 파일 및 비활성화 htaccess로 파일을 모두 (또는 특정 디렉토리 곳을 지정 .htaccess 파일 읽어야합니다.)

구성 파일에 배치 된 규칙은 한 번만 읽어야한다는 논리가 있습니다. htaccess 처리가 설정된 경우 모든 요청 에 대해 서버의 모든 디렉토리 (요청 된 디렉토리보다 높거나 높은)에서 가능한 htaccess 파일이 있는지 여부에 관계없이 검색해야합니다. 그리고 만일 그렇다면, 모든 사람은 새로 읽어야합니다.

  • apache docs 는 ".htaccess files"섹션의 맨 아래에 이것을 언급하지만 그 이유를 설명하지 않으며, 방법을 찾기 위해 파헤쳐 야합니다.
  • http://www.apacheweek.com/features/tips "Apache 속도를 높이는 방법"섹션은 그 이유 를 빠른 순서로 보여줍니다 .
  • Apache 성능 : .htaccess 비활성화 - "Apache 구성에서 .htaccess 비활성화 및 mod_rewrite 사용"섹션을 먼저 읽으십시오.

-1

동일한 우려 사항이 게시되었지만 이것은 서버 관리 사이트 관점에서 Apache 서버 구성 변경 후 Apache를 다시 시작할 수있게합니다.

지금까지 내가받은 가장 좋은 대답은 파일 관련 지시문을 먼저 나열하는 것입니다.

이것은 각 디렉토리에서 디렉토리와 htaccess 명령을 관리해야하는 아파치의 요구와 관련이 있습니다.

따라서 파일 관련 지시문을 먼저 나열한 다음 명백한 순서대로 아파치 htaccess 프로세스를 종료하는 명백한 블록을 나열하십시오.

요청을 최적화하는 가능한 솔루션 :-요청 URL 관련 수정-디렉토리 관련 제한-색인 관련 제한-파일 관련 제한-프록시 제한 <-모두 죽이기-빈 사용자 에이전트 <-모두 죽이기 ... 목록은 끝없는 재미

지시문의 순서와 관련된 나의 관심사. 예를 들어 RewriteConds 전에 Index, file 및 Header 지시문을 설정해야합니까?


각주 : RewriteRule 패턴 대체 [플래그]이 명백한 응용 프로그램 처리 질문에 대답하지 않습니다!
Testbench
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.