Press "Enter" to skip to content

[태그:] index

.htaccess 예제 및 설명

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond $1 !^(index\.php)
 RewriteCond %[REQUEST_FILENAME] !-f
 RewriteCond %[REQUEST_FILENAME] !-d
 RewriteRule ^(.*)$ index.php?param=$1 [L]
</IfModule>

.htaccess파일은 아파치 웹 서버에서 URL 재작성(rewriting)을 위해 사용됩니다.

위 내용은 사용자가 웹사이트의 특정 URL에 접근할 때, 해당 요청을 index.php 파일로 리디렉션하고, 추가로 파라미터를 변수를 전달하는 것입니다.

각각의 라인을 하나씩 뜯어보도록 합시다.

<IfModule mod_rewrite.c>

아파치의 mod_rewrite 모듈이 활성화되어 있을 때만 이 규칙을 적용하겠다는 뜻입니다. 

mod_rewrite 모듈은 URL을 재작성하는 데 사용됩니다.

RewriteEngine On
URL 재작성 기능을 활성화합니다. 

이 라인이 있어야만 아래의 RewriteRule과 RewriteCond가 적용됩니다.

RewriteCond $1 !^(index\.php)
조건을 정합니다.

요청된 URL이 index.php가 아닌 경우에만 아래의 규칙이 적용되도록 합니다. 

여기서 $1은 RewriteRule에서 첫 번째 그룹을 의미합니다.
!는 “부정(NOT)”을 의미하며, ^는 문자열의 시작을 의미하고, \.는 마침표(.)를 의미합니다. 

따라서 이 조건은 index.php로 시작하지 않는 요청을 의미합니다.

RewriteCond %{REQUEST_FILENAME} !-f

이 조건은 요청된 파일이 실제 서버에 존재하지 않는 경우에만 규칙을 적용하도록 합니다. 

-f는 실제 파일 여부를 확인하는 플래그입니다.

RewriteCond %{REQUEST_FILENAME} !-d
이 조건은 요청된 경로가 실제 디렉토리가 아닌 경우에만 규칙을 적용하도록 합니다. 

-d는 디렉토리 여부를 확인하는 플래그입니다.

RewriteRule ^(.*)$ index.php?param=$1 [L]
이 라인은 실제 재작성 규칙을 정의합니다.

  • ^(.*)$는 URL의 전체 경로를 저장합니다.
  • .*는 모든 문자열을 의미하며, 이는 그룹 $1에 저장됩니다.
  • index.php?param=$1는 저장된 URL 경로를 index.php의 param 파라미터로 전달합니다.
  • [L]은 이 규칙이 마지막이라는 것을 의미합니다. 이 규칙이 적용되면 추가적인 규칙은 처리되지 않습니다.

종합

이 .htaccess 파일은 다음과 같이 작동합니다:

요청된 URL이 index.php로 시작하지 않으면,

요청된 URL이 실제 파일이나 디렉토리가 아니라면,

그 요청을 index.php 파일로 리디렉션하고, 원래의 URL 경로를 param이라는 파라미터로 전달합니다.

예를 들어, 사용자가 test.com/data에 접근하면, 이 파일은 내부적으로 test.com/index.php?param=data로 리디렉션합니다.

    Mysql 인덱스(index) 와 컬럼 중복도(Cardinality)의 관계 정리

    중복도가 낮으면 카디널리티(Cardinality)가 높다고 표현하고, 중복도가 높으면 카디널리티가 낮다고 표현합니다.

    인덱스와의 관계는 중복도가 낮으면 효율이 높아지고, 중복도가 높으면 효율이 낮아집니다.

    중복도가 낮다는 것은 특정 컬럼의 데이터가 각기 다른 값이 들어간다는 뜻입니다.

    프라이머리 키(pk)나, 주민번호 같은 유일값일 수도 있고 풀네임 같이 중복은 있지만 그리 중복이 많지 않은 데이터를 가지고 있는 컬럼을 의미합니다.

    반면 중복도가 높다는 것은 같은 값이 많이 들어가는 컬럼을 의미합니다. 예를 들자면 성별 컬럼 정도 되겠습니다.

    1000만건의 데이터가 들어가 있어도 남자, 여자, 기타 정도 들어갈 테니깐 중복된 데이터가 겁나게 많겠죠.

    인덱스를 설정할때, pk 같이 중복도가 높은 컬럼에는 효율이 높지만, 성별같이 중복도가 높은 컬럼에 인덱스를 걸면 도리어 row가 늘어나면 늘어날 수록 효율성을 떨어뜨립니다.(업데이트, 인서트시 성능이 확!!! 떨어질 수 있습니다.)

    따라서 중복도가 높은 컬럼에만 인덱스를 설정할 것을 권장합니다.

    중복도를 조회하는 방법은 아래 쿼리를 사용합니다.

    show index from 테이블이름;

    조회되는 내용중에 Cardinality 값이 작은 column에는 인덱스를 걸지 마세요.