Apache rewite rule

2012/02/02 16:19
rewite rule 설정때문에 반나절을 잡아먹었다..ㅡ,.ㅡ;

fancy url을 사용하기 위해 요청파일이

- 없는 파일이거나
- .php확장자일 경우
- index.php로 redirect시킨다.


위 조건을 만족시키는 거였는데.. 

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} .*\.php$ [NC]
RewriteRule ^(.*)$ /index.php/$1 [L]


메뉴얼을 보고 나름 이해한대로 위처럼 만들었건만 모든 요청에 대해서 rewrite rule을 타는 상황이 발생;;

리서치 결과 %{REQUEST_FILENAME}가 물리적인 풀 패스 값이 아니라서 무조건 없는 파일로 인식을 해서 그런 것이었음.

https://issues.apache.org/bugzilla/show_bug.cgi?id=45280 에 보면

According to the documentation on
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html, the variable
REQUEST_FILENAME is the full local filesystem path:

"REQUEST_FILENAME 
The full local filesystem path to the file or script matching the request."

This seems not to be the case.

It seems the variable should be prefixed with DOCUMENT_ROOT to get the full
path.

Examples:
This does not trigger the rule:
RewriteCond %{REQUEST_FILENAME} -s

But this does:
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -s

Please update the documentation or the implementation.

I lost several hours over this and I guess I'm not the only one.


나와 같은 삽질을 하던 사람이 찾아서 아파치에 수정요청 해놓은 글을 볼 수 있음.

해서  
 

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1

RewriteCond %{REQUEST_FILENAME} .*\.php$ [NC]
RewriteRule ^(.*)$ /index.php/$1 [L]
 위와같이 바꿔 줌.

그리고 조건을 저렇게 나눠서 해줘야 하는데.. 플래그 [OR]로 연결하면 왜 안되는지는
모르겠음.. 그냥 조건이 여러개일 경우 저렇게 나눠줘야 한다고 이해하고 넘어감..ㅡ,.ㅡ;
치환할 패턴에서 &를 이용하면 검색패턴 전체를 선택할 수 있다.
예를 들면

<test>
    asdf
</test>

위에서 asdf아래 라인에 aaaa를 추가하고 싶을 경우에
%s/asdf\n/&aaaa/g 
이렇게 할 수 있고

aaaa다음에 한 줄을 띄우고 싶을 때 \n으로 하면 실제 한 줄이 띄어지진 않고 개행 문자가 표시 되는데 \r로 해주면 된다.
 %s/asdf\n/&aaaa\r/g
이렇게~ 
 64bit에서는 php로 아무 설정없이 2G이상의 파일을 컨트롤(fopen, fwrite등) 할 수 있지만 32bit에서는 기본적으로 불가능하다. 이것이 가능하게 하려면 php컴파일 시에 CFLAGS에 -D_FILE_OFFSET_BITS=64를 주고 컴파일을 해야한다.
CFLAGS="-D_FILE_OFFSET_BITS=64" ./configure --with-each-optoins 
 위와같은 방버으로 말이다.
  하지만 php에만 이 옵션을 주고 fopen을 테스트 해보니 안된다.; 이리저리 하다가 아파치에도 같은 옵션을 주고 컴파일을 해보니 성공;; 머 뻘짓을 좀 하긴 했지만 어쨋든 결론은 아파치에도 같은 옵션을줘야 한다는거! 잊지말자;
 그리고! 무엇보다 이런 옵션 보다는 그냥 64bit를 사용하자ㅋ 어차피 이 옵션을 줘도 filesize()같은 펑션은 사용불가 인 듯! 

==========================================================

꼼수로 구현해 놓은 소스가 있었음; 

 
function fsize($file) {
  // filesize will only return the lower 32 bits of
  // the file's size! Make it unsigned.
  $fmod = filesize($file);
  if ($fmod < 0) $fmod += 2.0 * (PHP_INT_MAX + 1);

  // find the upper 32 bits
  $i = 0;

  $myfile = fopen($file, "r");

  // feof has undefined behaviour for big files.
  // after we hit the eof with fseek,
  // fread may not be able to detect the eof,
  // but it also can't read bytes, so use it as an
  // indicator.
  while (strlen(fread($myfile, 1)) === 1) {
    fseek($myfile, PHP_INT_MAX, SEEK_CUR);
    $i++;
  }

  fclose($myfile);

  // $i is a multiplier for PHP_INT_MAX byte blocks.
  // return to the last multiple of 4, as filesize has modulo of 4 GB (lower 32 bits)
  if ($i % 2 == 1) $i--;
  
  // add the lower 32 bit to our PHP_INT_MAX multiplier
  return ((float)($i) * (PHP_INT_MAX + 1)) + $fmod;
}

PHP Memcached 연동(펌)

2011/11/08 11:03

Memcached 사용하기

(편의상 존칭은 생략했습니다. ^^)
Memcached 데몬
사이트 : http://www.danga.com/memcached/
다운로드 : http://memcached.googlecode.com/files/memcached-1.2.8.tar.gz

Memcached PHP Extension
사이트 : http://pecl.php.net/package/memcache
다운로드 : http://pecl.php.net/get/memcache-2.2.5.tgz

LibEvent 
사이트 : http://monkey.org/~provos/libevent/
다운로드 : http://monkey.org/~provos/libevent-1.4.11-stable.tar.gz

Memcached 는 데이터를 메모리에 저장하여 이용할 수 있는 데몬이다. 분산처리가 가능하고 매우 빠른 성능을 지닌 캐시 이다. 
(편의상 root로 작업)

1. Memcached 설치

우선 Memcached 를 적당한 디렉토리 (/usr/local/src) 등에 다운로드를 받는다. 
# tar zxvf memcached-1.2.8.tar.gz
# cd memcached-1.2.8
# configure --prefix=/usr/local/memcached
* checking for libevent directory... configure: error: libevent is required 메세지가 나오면 libevent 라이블러리를 설치를 해줘야 한다.
 
make 
make install

1-1 memcached 실행
cd /usr/local/memcached (configure 에서 지정한 prefix로 이동)
bin/memcached -u [실행될 사용자] & 
* 실행될 사용자는 memcached 데몬이 -u 옵션으로 지정된 사용자로 실행이 된다 (root로 지정하면 안됨)
netstat -na | grep 11211
->
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      
tcp        0      0 :::11211                          :::*                            LISTEN

포트를 확인한다.

2. Memcache PHP Extension 
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
phpize
./configure 
make
cp .libs/memcache.so /(php 익스텐션 디렉토리) php.ini에서 지정한 extension_dir 에서 설정한 디렉토리 
php -m | grep memcache 로 모듈 확인
# /etc/init.d/httpd restart 또는 /usr/local/apache/bin/apachectl restart 로 Apache 재시작 

PHP info 확인

사용자 삽입 이미지

3. Libevent 설치 (옵션)
* Memcache Configure 중 libevent 가 필요하다는 메세지를 보내고 중단이 되었을때 설치를 한다.

libevent 를 다운로드 받는다. 
tar zxvf libevent-1.4.11-stable.tar.gz
cd libevent-1.4.11-stable
./configure 
make
make install (/usr/local/lib 에 libevent.so 파일이 존재하는지 확인한다.)
ldconfig (vi /etc/ld.so.conf 에 /usr/local/lib 추가를 한다.

[출처] http://www.lovelgw.com/Blog/94 

4. 추가옵션 - phpize실행 시 autoconf없다는 에러 나는 경우
# cd /usr/local/src (적당한 곳으로 이동)
m4설치
# wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
# tar zxvf m4-1.4.9.tar.gz
# cd m4-1.4.9/
# ./configure && make && make install
# cd ../
autoconf 설치 
# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
# tar zxvf autoconf-2.62.tar.gz
# cd autoconf-2.62/
# ./configure && make && make install

 

그동안 vi를 써오면서 익힌 단축키를 정리한다.

첫번째로 기본적으로 알고 시작해야 하는 이동/입력/삭제/복사등에 관련된 키들이다.

<이동>
j - 커서를 아래로 이동 
k - 커서를 위로 이동
h - 커서를 왼쪽으로 이동
l - 커서를 오른쪽으로 이동

Ctrl+f - 커서를 한페이지 아래로 이동 
Ctrl+b - 커서를 한페이지 위로 이동

Ctrl+d - 커서를 반페이지 아래로 이동
Ctrl+u - 커서를 반페이지 위로 이동

Ctrl+e - 커서고정 상태로 화면을 한줄 씩 아래로 이동 
Ctrl+y - 커서고정 상태로 화면을 한줄 씩 위로 이동

Shift+l - 커서를 현재 화면의 맨 아래줄로 이동
Shift+h - 커서를 현재 화면의 맨 윗줄로 이동 

g+g - 커서를 첫출로 이동
Shift+g - 커서를 마지막 줄로 이동 

^(Shift+6) - 현재 커서가 있는 줄 맨 앞으로 이동
$(Shift+4) - 현재 커서가 있는 줄 맨 뒤로 이동

w - 한 단어씩 앞으로 이동
Shift+w - 한 공백씩 앞으로 이동

b - 한 단어씩 뒤로 이동
Shift+b - 한 공백씩 뒤로 이동

<입력>
i - 현재 커서의 위치부터 입력 시작
Shift+i - 현재 커서가 있는 줄 맨 앞으로 이동 후 입력 시작

a - 현재 커서다음부터 입력 시작
Shift+a - 현재 커서가 있는 줄 맨 뒤로 이동 후 입력 시작

s - 현재 커서가 있는 문자를 지우고 입력 시작
Shift+s - 현재 커서가 있는 줄 전체를 지우고 입력 시작

o - 현재 커서가 있는 줄 아래줄부터 입력 시작
Shift+o - 현재 커서가 있는 줄 윗줄부터 입력 시작 

※ 삭제/복사/블럭모드 시작 후 종료는 esc
<삭제>

d - 현재 커서가 있는 위치부터 삭제모드 시작 (j, k, h, l, Shift+g, g+g, w, b,^,$, 숫자키 등과 키 조합을 하여 사용)
d+d - 현재 커서가 있는 줄 삭제

<복사>
y - 현재 커서가 있는 위치부터 복사모드 시작 (j, k, h, l, Shift+g, g+g, w, b,^,$, 숫자키 등과 키 조합을 하여 사용)
y+y - 현재 커서가 있는 줄 복사 

<붙여넣기>
p - 현재 커서가 있는 위치 다음에 붙여넣기(복사된 데이터에 라인피드가 있을경우 아랫줄에 붙여짐)
Shift+p - 현재 커서가 있는 위치 이전에 붙여넣기(복사된 데이터에 라인피드가 있을경우 윗줄에 붙여짐)

<블럭> - 블럭을 씌운 후 y를 누르면 복사가 됨.
v - 현재 커서가 있는 위치부터 블럭모드 시작 (이동키로 블럭을 씌운다.)
Shift+v - 현재 커서가 있는 줄전체 블럭을 씌운 후 블럭모드 시작 (이동키로 블럭을 씌운다.)


 
TAG vim, 단축키