게시판에 글을 작성할 때 본문 내용이 정상적으로 다 올라가지 않고 뒷부분이 잘리는 경우가 있습니다.

- 웹페이지에서 글을 복사해서 그대로 붙여 넣을 경우

- 한글이나 워드 프로그램에서 작성한 문서 내용을 복사해서 그대로 붙여 넣을 경우

특히 위와 같은 경우 글을 붙여 넣고 에디터 하단 탭에서 HTML 소스 보기를 해보면 다량의 태그 코드가 추가돼있는 걸 확인할 수가 있는데 그래서 데이터 저장 허용 크기를 넘어선 부분들은 전부 누락되는 것이죠.

 

1. 게시판 필드 타입 변경

그누보드는 게시판 내용 값이 저장되는 wr_content 필드 타입이 TEXT로 되어 있습니다.

해당 필드 타입을 TEXT에서 MEDIUMTEXT 또는 LONGTEXT로 변경합니다.

phpMyAdmin 을 이용하면 쉽게 변경할 수 있습니다.

웹호스팅을 이용 중이라면 내 호스팅 관리 메뉴 등에 phpMyAdmin 접속 링크가 대부분 있을 겁니다.

좌측 DB 테이블에서 원하는 게시판 선택 후 wr_content 필드 수정 버튼 클릭

g5_write_1111 이런 형태로 되어 있는 게 게시판 테이블이고 끝부분 1111 이 게시판 id 입니다.

수정 화면에서 필드 종류를 TEXT 에서 MEDIUMTEXT 또는 LONGTEXT 로 변경

phpMyAdmin 을 사용하기 곤란한 상황이거나 위와 같이 적용했는데 에러가 뜬다면 이렇게 하세요.

해당 게시판에서 사용하고 있는 게시판 스킨 write.skin.php 파일 상단 

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

위 코드 바로 밑에 다음 코드를 추가합니다.

MEDIUMTEXT 로 변경하려면 이렇게..

sql_query(" ALTER TABLE `{$write_table}` CHANGE `wr_content` `wr_content` MEDIUMTEXT NOT NULL ");

LONGTEXT 로 변경하려면 이렇게..

sql_query(" ALTER TABLE `{$write_table}` CHANGE `wr_content` `wr_content` LONGTEXT NOT NULL ");

MEDIUMTEXT 또는 LONGTEXT 둘 중 하나만 선택해서 적용하세요.

write.skin.php 파일에 위 코드를 추가하고 게시판 클릭 후 글쓰기 화면을 한 번 띄워주면 자동으로 변환됩니다.

다른 게시판도 바꾸고 싶으면 변환하고자 하는 게시판을 클릭 후 마찬가지로 글쓰기 화면을 띄워주면 됩니다.

해당 게시판에서 사용되고 있는 스킨 파일에 적용한 게 맞는지 정확히 확인하세요.

요즘은 반응형 테마까지 나와서 다른 스킨 파일에 잘못 적용하는 분들이 의외로 많이 계십니다.

적용 후 해결이 되면 추가했던 위 코드는 반드시 다시 삭제하세요.

2. bbs/write_update.php 파일 수정

if (isset($_POST['wr_content'])) {
    $wr_content = substr(trim($_POST['wr_content']),0,65536);
    $wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
}


 여기서 이 부분 숫자를 아래 참고사항에 있는 최대 저장 크기 값 참고해서 적당히 늘려주거나

$wr_content = substr(trim($_POST['wr_content']),0,16777216);

 아니면 이렇게 없애버립니다.

$wr_content = trim($_POST['wr_content']);

 

* 참고사항 (데이터 타입별 최대 저장 크기)

TEXT : 65535
MEDIUMTEXT : 16777215
LONGTEXT : 4294967295

3. lib/editor.lib.php 파일 수정

아래 함수를 찾은 후 maxlength=\"65536\" 이 부분 최대 저장 크기를 2번 내용처럼 적당히 변경하거나 삭제

function editor_html($id, $content)
{
    return "<textarea id=\"$id\" name=\"$id\" style=\"width:100%;\" maxlength=\"65536\">$content</textarea>";

}

 

출처 : https://gnustudy.com/bbs/board.php?bo_table=gnu_tip&wr_id=24

서버에서 파일명이 깨지는 경우 인코딩 변경으로 문제를 해결할 수 있는 명령어이다.
이종간의 OS (예 : 윈도우와 MAC) 에서 주로 발생하는데
윈도우는 EUC-KR이 기본 인코딩이고 MAC은 UTF-8이 기본 인코딩이라 MAC에서 FTP등을 통해 한글파일이나 폴더를
업로드할 경우 인코딩이 깨진채로 업로드된다.
이런 경우 convmv라는 유용한 명령어가 있는데 명령어가 없다면 아래 명령어로 설치한다.
(CentOS 또는 RockyLinux) yum install convmv

폴더로 들어가서 처리를 할 경우 아래와 같이 명령어를 선택하면 해당 폴더에 있는 euc-kr 인코딩이 utf-8 인코딩 방식으로 바뀐다.

[EUC-KR → UTF-8]

convmv -f euc-kr -t utf-8 ./*.* --notest

[UTF-8 → EUC-KR]

convmv -f utf-8 -t euc-kr ./*.* --notest

여기서 --notest 를 입력하지 않을 경우 인코딩 방식은 바뀌지 않고,  어떻게 변경되는지만 확인할 수 있다.

참고로 현재 위치에서 하위 디렉토리까지 포함하여 인코딩 방식을 변경하기 위해서는 -r 옵션을 추가하면 된다.

convmv -f euc-kr -t utf-8 ./*.* -r --notest

특정파일 1개만 변경할 때는 아래와 같이 처리한다.

convmv --notest --replace -r -f euc-kr -t utf-8 FileName

--replace 옵션은 동일한 파일명으로 덮어쓰기 하고 싶을 때 추가

자바스크립트로 form 태그의 input 검증(validation) 후에 수동으로 submit 처리하기
 
기본적으로 <form>태그를 사용하여 입력한 데이터를 웹서버로 전송할때 <input>태그의 type="submit"을 통해 전송버튼을 만들어 사용합니다.
input submit의 경우 form 안에 있는 모든 inputvalue를 전송하게 되는데, 이경우 각 input에 값이 입력되었는지 등의 여부를 검증(validation)할 수 없습니다.
따라서 이 경우 <input type="button">으로 버튼을 하나 만들고 onClick이벤트를 직접 핸들링하여, 버튼을 클릭했을 때 각 입력값을 검증한 후 수동으로 submit처리 해주어야 합니다.
 
예제
다음은 form의 입력값을 검증하고 수동으로 submit 처리하는 예제입니다. git링크
 

javascriptStudy/javascriptStudy/formValidation.html at master · dololak/javascriptStudy

Contribute to dololak/javascriptStudy development by creating an account on GitHub.

github.com

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
    <title>로그인</title>
    <script type="text/javascript">
        function login(){
            var loginForm = document.loginForm;
            var userId = loginForm.userId.value;
            var password = loginForm.password.value;
            
            if(!userId || !password){
                alert("아이디와 비밀번호를 모두 입력해주세요.")
            }else{
                loginForm.submit();
            }
        }
    </script>
</head>
<body>
    <form name="loginForm" action="http://localhost/login"  method="post">
            계정 : <input type="text" name="userId"><br>
            비밀번호 : <input type="password" name="password"><br>
            <input type="hidden" name="loginType" value="admin">
            <input type="button" onclick="login()" value="로그인">
    </form>
</body>
</html>

form 태그의 로그인 button에 onClick 이벤트의 핸들러로 login() 함수를 연결해두었습니다. 로그인 버튼을 클릭하게 되면 <script>태그에 선언되어있는 login()함수가 핸들러로 호출됩니다.

<input type="button" onclick="login()" value="로그인">

핸들러로 사용한 login()함수입니다. document 객체를 이용해 loginForm을 조작합니다. DOM을 이용하면 name 속성을 통해 쉽게 접근할 수 있습니다. 
javascript에서는 값이 0, undefined, null, 공백인 경우 false로 처리하는 특성이 있기때문에 not을 의미하는 !연산자를 이용하여 입력 여부를 판단하였습니다.

function login(){
    var loginForm = document.loginForm;
    var userId = loginForm.userId.value;
    var password = loginForm.password.value;
    
    if(!userId || !password){
        alert("아이디와 비밀번호를 모두 입력해주세요.")
    }else{
        loginForm.submit();
    }
}

값이 하나라도 입력되지 않은 경우 alert()를 이용해 경고를 띄우고 모두 입력된 경우 form 객체의 submit()메서드를 실행합니다. 
submit()메서드는 이미 브라우저에 정의되어 있는 메서드로 실제 input type="submit"이 클릭 되었을 때 실행되는 메서드입니다.

테스트
값을 하나라도 입력하지 않고 로그인 버튼을 클릭하면 경고창이 나타납니다.

모두 입력한 경우에는 경고창이 나타나지 않고 submit()이 실행되고 action 속성에 정의된 경로로 HTTP 요청을 수행합니다.

예제이므로 웹서버가 준비되어 있지 않아 이후 내용은 별다른게 없습니다.

HTTP 요청 메시지를 분석해보면 입력한 내용들이 잘 전송된것을 볼 수 있습니다. 여기서 눈여겨 볼 점은 input type="hidden"으로 선언되어 있던 input의 value값 또한 전송이 된다는 점 입니다.

POST http://localhost/login HTTP/1.1
Host: localhost
Proxy-Connection: keep-alive
Content-Length: 44
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like  Gecko) Chrome/75.0.3770.142 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
 
userId=dololak&password=1234&loginType=admin

 

출처 : https://dololak.tistory.com/728

'Programming > PHP' 카테고리의 다른 글

PHP 날짜 함수 사용하기 - date, strtotime, mktime  (1) 2024.06.14
D-Day 계산기  (0) 2016.05.25

터미널에서 인터넷 속도 측정이 하고 싶어서 조사해본 내용 정리.

설치

https://www.speedtest.net/ko/apps/cli

sudo apt-get install speedtest로 설치하면 서버 목록이 10개밖에 안 되는 비공식 버전을 받게 된다. 그러므로 다음과 같이 설치하자.

혹시 이미 비공식 버전을 설치했다면, 위 공식사이트 링크의 주석을 따라 삭제하는 절차를 밟도록 하자.

[맥OS]

brew tap teamookla/speedtest
brew update
brew install speedtest --force

[리눅스 데비안(우분투) 계열]

curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash
sudo apt-get install speedtest

[리눅스 레드햇 계열]

curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.rpm.sh | sudo bash
sudo yum install speedtest

실행 방법은 간단하다. 실행하고 yes를 입력해 라이센스에 동의한다.

speedtest

결과

   Speedtest by Ookla

      Server: Ookla - Seoul (id: 5249)
         ISP: Lg Powercomm
Idle Latency:    10.36 ms   (jitter: 0.64ms, low: 9.57ms, high: 11.03ms)
    Download:   876.93 Mbps (data used: 797.8 MB)                                                   
                 77.18 ms   (jitter: 7.83ms, low: 8.93ms, high: 133.85ms)
      Upload:   866.89 Mbps (data used: 725.8 MB)                                                   
                  8.80 ms   (jitter: 0.54ms, low: 7.42ms, high: 10.87ms)
 Packet Loss:     0.0%
  Result URL: https://www.speedtest.net/result/c/c0c219c5-eeea-471d-8f99-188844c7a165

출처 : https://velog.io/@jay6768/%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%86%8D%EB%8F%84-%EC%B8%A1%EC%A0%95-speedtest-cli

ls -l 출력 시 날짜 변경( 12월  2009 -> 2009-07-01 08:35 )

변경 전

[root@wooseob ~]# ls -l
-rw------- 1 root root  1104 12월 17 03:22 anaconda-ks.cfg
-rw-r--r-- 1 root root 25690 12월 17 03:22 install.log
-rw-r--r-- 1 root root  4508 12월 17 03:21 install.log.syslog

# alias ls='ls --color=auto --time-style=long-iso'          날짜표시 변경하는 명령어

변경 후

[root@wooseob ~]# ls -l
-rw------- 1 root root  1104 2012-12-17 03:22 anaconda-ks.cfg
-rw-r--r-- 1 root root 25690 2012-12-17 03:22 install.log
-rw-r--r-- 1 root root  4508 2012-12-17 03:21 install.log.syslog

 

개인 사용자(~/.bashrc 기재)

[root@wooseob ~]# vi ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ls='ls --color=auto --time-style=long-iso'       -  추가 입력

전체 사용자 적용 시

[root@wooseob ~]# vi /etc/bashrc
# /etc/bashrc

# System wide functions and aliases
# Environment stuff goes in /etc/profile

alias ls='ls --color=auto --time-style=long-iso'        -  추가 입력

출처 : https://faq.hostway.co.kr/Linux_ETC/4495

command+F9을 눌러서 한글/한자 변환이 되지 않는다면 fn+command+F9키를 눌러 변환 확인을 해주시기 바랍니다.

fn 기능키 설정 상태에 따라 한글/한자 변환 단축키는 다음과 같습니다.

 

- fn 기능키 설정한 상태 : command+F9 (도움말 안내 내용과 동일)

- fn 기능키 설정하지 않은 상태 : fn+command+F9

 

[fn 기능키 설정 방법]

1) 맥OS 화면 상단의 애플 아이콘 클릭 > 시스템 설정

2) 키보드 > 키보드 단축키

3) fn 기능키 > "F1, F2 등의 키를 표준 기능 키로 사용" 설정 후 완료버튼 클릭

[출처] https://www.hancom.com/cs_center/csFaqDetail.do?pageInfo.page=&faq_ctgr_cd=003&faq_ctgr_lv=1&faq_seq=2914&faqCtgr1=003&faqCtgr2=&faqCtgr3=

$ scp -P [port] [보낼파일] xxx@[ip addr]:~
ex) scp -P 22 test.txt abc@11.22.33.44

위의 명령을 통해 scp를 수행했는데 아래와 같은 에러가 떴다.

subsystem request failed on channel 0
scp: Connection closed

-O 옵션을 추가해주면 문제가 해결된다.

$ scp -O -P 22 test.txt abc@11.22.33.44

출처 : https://me74.tistory.com/130

로그는 모든 웹 서버에 비종속적으로 사용하기 위해서 Common Log Format(CLF)라는 포맷을 사용하고 있다.
이 포맷은 클라이언트의 요청에 대한 로그를 각각의 줄로 기록을 하게 되며, 한 중에서는 스페이스로 구별을 하여 로그 정보를 적고 있다. 이 파일 포맷은 거의 모든 웹 서버에서 지원을 하고 있으나 때에 따라서 웹 서버를 만든 제작사의 포맷 또는 DB에 바로 저장할 수 있는 기능을 가지고 있는 웹 서버도 있다.
로그를 기록하기 위한 지시자는 TransferLog, LogFormat, CustomLog 세 개의 지시자이다.


1. TransferLog

Syntax : TransferLog file-pipe

TransferLog는 로그를 적을 파일 또는 프로그램을 지정할 수 있다. 로그는 파일에 적을 수도 있지만 특정 파이프 라인을 통해서 프로그램으로 바로 전달할 수도 있다.
TransferLog 지시자에는 특정 로그 포맷을 지정할 수 없기 때문에 가장 나중에 정의한 LogFormat을 사용한다. 특정 로그 포맷이 정의되지 않았다면 CLF 로그 파일 포맷을 따르게 된다.

예를 들어서 간략하게 A,B,C 세 개의 로그 포맷을 지정했다면 TransferLog가 사용하는 로그 포맷은 LogFormat C를 사용하게 된다.

 

LogFormat "포맷형식" A
LogFormat "포맷형식" B
LogFormat "포맷형식" C
TransferLog logs/access.log

위의 예제는 C 포맷을 사용한다. 로그가 쌓일 대상 파일은 logs/access.log 파일이다. 이 매개 변수가 "/"로 시작하지 않았기 때문에 ServerRoot 밑에 있는 logs 디렉토리에서 access.log 파일에 로그를 적게 되는 것이다. 만약에 "/"로 경로가 시작되었다면 이 경로는 절대 경로가 된다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

TransferLog logs/access.log 


2. CustomLog

Syntax : CustomLog file-pipe format-or-nickname

CustomLog는 TransferLog와 똑 같은 기능을 지니고 있는 지시자이지만 매개 변수에 포맷을 따로 지정하거나 가칭을 적을 수 있다.

LogFormat "포맷형식" A
LogFormat "포맷형식" B
LogFormat "포맷형식" C
CustomLog logs/access.log A

 

위와 같이 로그 파일을 정의했다면, LogFormat에서 A 라고 별명을 달아논 포맷을 가지고 logs/access.log 파일에 로그를 적게 된다. 물론 이 별칭 대신에 포맷을 직접 적어도 상관이 없다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog logs/access.log agent


3. LogFormat

Syntax : LogFormat format [nickname]
               Default: LogFormat "%h %l %u %t \"%r\" %s %b"

LogFormat은 CLF 로그 포맷과 별도로 관리자가 정의한 로그 파일 형식을 만들기 위해서 사용이 되어진다.

다음 표는 로그 포맷에서 사용이 되어지는 변수들이다.(포맷에 대한 조금 더 자세한 내용은 Apache HTTP Server Project 를 참조)

 

변수   설명
%% : 퍼센트 기호
%...a : 요청한 클라이언트의 IP주소(원격 IP주소)
%...A : 로컬 IP 주소(서버 IP주소)
%...B : HTTP 헤더를 제외한 전송 바이트의 수
%...b : HTTP 헤더를 제외한 전송 바이트의 수. 전송 바이트가 없는 경우에 CLF에서 0으로
   표기하지 않고 '-'로 표기한다.
%...{Foobar}C : 서버가 수신한 요청에서 Foobar 쿠키의 내용
%...D : 요청을 처리하는데 걸린 시간(마이크로초 단위)
%...{Foobar}e : Foobar라는 환경 변수
%...f : 파일명
%...h : 요청한 원격 호스트(예:210.210.210.10)
%...H : 요청 프로토콜(예:HTTP/1.1)
%...{Foobar}i : Foobar의 내용-서버에 요청을 할 때의 헤더에 있는 내용
%...l : 리모트 로그인 이름(identd 데몬으로 부터 얻어 올 수 있을 때, 없을 경우 - 표시)
%...m : 요청 메소드(예:GET 또는 POST)
%...{Foobar}n : 다른 모듈에서 "Foobar"의 내용
%...{Foobar}o : Foobar의 내용 - 응답에서 헤더에 있다
%...p : 응답을 처리해준 서버의 포트(예:80)
%...P : 응답을 처리해준 차일드 프로세스의 프로세스 번호(예:14633)
%...{format}P : 요청을 서비스하는 자식의 프로세스 ID 혹은 쓰레드 ID. format에는 pid와 tid가
   가능하다
%...q : 쿼리 스트링(예:http://www.webnkorea.com/server-status?refresh=5라고 하면
   '?refresh=5' 가 기록된다. 쿼리 스트링이 없으면 빈 공백이 들어간다)
%...r : 요청을 할때의 첫 라인(index.html을 요청을 했다면 다음과 같이 기록 된다.
   (GET/HTTP/1.1)
%...s : 요청에 대한 서버의 상태
%...t : 요청을 받은 시간, CLF에서 시간과 같다(영어로 표기됨)
%...{format}t : 주어진 형식의 시간. strtime(3) 포맷으로 주어져야 한다.
%...T : 서버가 요청을 처리하는 데 걸리는 시간(초)(예:1초 미만일 경우 '0'으로 표기)
%...u : 원격 사용자 이름
%...U : 요청한 URL
%...v : 요청에 대해서 처리를 한 서버 이름(예:www.webnkorea.com)
%...V : UseCanonicalName 설정에 따른 요청에 대해서 처리한 서버 이름
%...I : 요청과 헤더를 포함한 수신 바이트수로 0일 수 없다.(영문자 아이임)
   (사용하려면 mod_logio가 필요하다)
%...O : 헤더를 포함한 송신 바이트수로 0일 수 없다.(사용하려면 mod_logio가 필요하다)

 

LogForamt 지시자에서 위의 변수들을 사용해서 마음대로 로그 포맷을 바꿀 수 있다. 자신이 모니터링하고 싶은 정보만을 로그에 기록함으로써 가독성을 늘리고 데이터의 크기를 줄일 수 있다.


4. 다중 로그 파일
현재의 아파치 버전에서는 하나의 요청에 대해서 여러 개의 로그 파일을 만들 수 있다. 만약 두 개의 로그 파일을 만든다고 가장할 때 하나는 디폴트인 CLF 포맷을 사용할 수 있고 다른 하나는 자신이 정의한 포맷을 지정해서 사용할 수도 있다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

TransferLog logs/access.log

LogFormat "%u %U %p" my

CustomLog logs/access.log my


TransferLog 앞에는 어떠한 LogFormat도 지정하지 않으면 기본적으로 CLF 포맷으로 로그를 만들게 된다. 다음에 LogFormat 지시자를 사용해서 포맷을 지정하고 별칭을 my로 지정한 후 CustomLog 지시자를 사용해서 자신이 원하는 로그 포맷을 사용할 수 있다.

이 로그 형식은 가상 사이트 컨테이너인 <Virtual></Virtual>에서 따로 로그에 대한 설정을 하지 않는다면 메인 프로세스의 로그 파일에 로그자 저장된다.


5. TIP(가상 호스트에 대한 효율적인 로그 관리)
일반적으로 가상 호스트에 대해서 따로 로그를 관리하지는 않지만, 웹호스팅을 하는 업체라면 고객으로 부터 자신의 사이트에 대한 통계를 요청받는 경우가 있다. 이러한 경우, 효율적으로 로그를 관리하기 위해서 가상 호스트에 대해서 따로 로그를 만들어 줄 필요가 있다. 물론 한 파일에서 관리한 다음 각각의 가상 호스트에 대한 로그로 필터링을 하면 되겠지만, 아무래도 개별 파일에서 관리하는 것 보다 깔끔하지 않다.

 

그래서 log 디렉토리 밑에 logs/vhost 라는 디렉토리를 만든 다음 도메인 이름명을 따서 로그 파일을 만드는 방법이 유용하다. 따라서 webnkorea.com 이라는 가상 호스트가 있다면, <Virtual></Virtual> 컨테이너 안에 로그 파일에 대한 설정을 다음과 같이 해 준다.


CustomLog logs/vhost/diverman.com-access_log "Format"

이렇게 하면 각각의 가상 호스트에 대해서 로그 파일을 관리해 줄 수 있다. 좀 더 신경을 쓴다면 rotatelog 데몬을 이용해서 로그가 일정 크기 이상 증가하지 않도록 해 주는 것도 좋을 것이다.

출처: https://berry2.tistory.com/entry/Apache-Access-Log-Format [베리베리 지식창고:티스토리]

1. 마이그레이션

1-1. 접근 제어 선언 방식 변경

  • 2.2에서 Order, Allow , Deny 등의 지시자로 하던 접근 제어 설정은 Require 를 이용한 방식으로 변경되어야한다.

1) 모든 요청 거부

# 2.2 설정
Order deny,allow
Deny from all

# 2.4 설정
Require all denied

 

2) 모든 요청 허용

# 2.2 설정
Order allow,deny
Allow from all

# 2.4 설정
Require all granted

 

3) example.org 허용 나머지 거부

# 2.2 설정
Order Deny,Allow
Deny from all
Allow from example.org

# 2.4 설정
Require all denied
Require host example.org

 

4) 127.0.0.1 허용 나머지 거부

# 2.2 설정
Order Deny,Allow
Deny from all
Allow from 127.0.0.1

# 2.4 설정
Require all denied
Require ip 127.0.0.1

 

1-2. 속성/모듈 변경

  • 속성/모듈 변경
    • Httpd의 기존 설정에서 아래 속성/모듈과 관련된 선언이 있다면, 이름을 바꾸어준다.
    • 속성명
      • MaxClients -> MaxRequestWorkers
      • MaxRequestsPerChild -> MaxConnectionsPerChild
    • 모듈명
      • mod_disk_cache -> mod_cache_disk
    • KeepAlive 
      • 속성은 On 이나 Off 중 하나의 값을 가질수 있다. 0,1과 같이 숫자로 선언되어 있는 경우가 있었다면 수정해야 한다.
<IfModule mpm_prefork_module>
    StartServers          30
    MinSpareServers       30
    MaxSpareServers      128
    ServerLimit         1024
    MaxClients          1024 # MaxClients -> MaxRequestWorkers
    MaxRequestsPerChild  100000 # MaxRequestsPerChild -> MaxConnectionsPerChild
</IfModule>

...

KeepAlive Off # 속성은 On 이나 Off 중 하나의 값을 가질수 있다.

 

  • 속성 디폴트 값 변경 확인
    • 아래 속성들은 디폴트값이 바뀌었다.
    • 기존에 암묵적으로 디폴트값에 의존을 했었다면 명시적으로 선언한다.
  • Options 내 -,+ 모두 표시
    • Either all Options must start with + or -, or no Option may.
    • 오류가 발생시 모든 Options 내  +, -  표시를 해주어야 합니다.
<Directory "/home1/irteam/deploy/doc_base">
        Options -Indexes FollowSymLinks MultiViews # Options -Indexes +IncludesNoExec +FollowSymLinks +MultiViews
        AllowOverride None # 명시적으로 선언
        Order allow,deny
        Allow from all
        FileETag None # 명시적으로 선언
</Directory>

 

2. 오류로그 및 해결책

오류 1

# 오류 로그
httpd: Syntax error on line 59 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf: 
Cannot load modules/mod_authz_default.so into server: /home1/irteam/apps/apache/modules/mod_authz_default.so: cannot open shared object file: No such file or directory

# 해결 방법
mod_authz_default 삭제

 

오류 2

# 오류 로그
httpd: Syntax error on line 73 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Cannot load modules/mod_ident.so into server: /home1/irteam/apps/apache/modules/mod_ident.so: cannot open shared object file: No such file or directory

# 해결 방법
mod_ident 삭제

 

오류 3

# 오류 로그
AH00534: httpd: Configuration error: No MPM loaded.

# 해결 방법
추가 LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

 

오류 4

# 오류 로그
AH00526: Syntax error on line 106 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'User', perhaps misspelled or defined by a module not included in the server configuration


# 해결 방법
추가 LoadModule unixd_module modules/mod_unixd.so

 

오류 5

# 오류 로그
AH00526: Syntax error on line 214 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration

# 해결 방법
추가 LoadModule access_compat_module modules/mod_access_compat.so

 

오류 6

# 오류 로그
[Thu Aug 01 16:16:15.768125 2019] [core:warn] [pid 29604] AH00117: Ignoring deprecated use of DefaultType in line 281 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf.
AH00526: Syntax error on line 325 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'Require', perhaps misspelled or defined by a module not included in the server configuration

# 해결 방법
추가 LoadModule authz_core_module modules/mod_authz_core.so

 

오류 7

# 오류 로그
[Thu Aug 01 16:17:14.560832 2019] [core:warn] [pid 29690] AH00117: Ignoring deprecated use of DefaultType in line 282 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf.
AH00526: Syntax error on line 353 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'LockFile', perhaps misspel

# 해결 방법
DefaultType text/plain -> ForceType text/plain(모든 응답을 text/plain으로 처리함.) 옵션 제거 할 것

 

오류 8

# 오류 로그
AH00526: Syntax error on line 353 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'LockFile', perhaps misspelled or defined by a module not included in the server configuration

[Mon Aug 05 15:47:04.456821 2019] [core:warn] [pid 26228] AH00117: Ignoring deprecated use of DefaultType in line 280 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf.
AH00526: Syntax error on line 396 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Invalid command 'Allow', perhaps misspelled or defined by a module not included in the server configuration

# 해결 방법
LockFile "logs/accept.lock" -> Mutex file:/home1/irteam/logs default

 

오류 9

# 오류 로그
AH00526: Syntax error on line 521 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
JkWorkersFile: Can't find the workers file specified

# 해결 방법
/home1/irteam/apps/apache/conf/workers.properties 추가

 

오류 10

# 오류 로그
AH00526: Syntax error on line 600 of /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:
Either all Options must start with + or -, or no Option may.

# 해결 방법
Options -Indexes FollowSymLinks MultiViews
>> Options -Indexes +FollowSymLinks +MultiViews

 

오류 11

# 오류 로그
AH00548: NameVirtualHost has no effect and will be removed in the next release /home1/irteam/apps/apache-2.4.39/conf/httpd.conf:626
AH00112: Warning: DocumentRoot [/data/images/deploy/doc_base] does not exist
AH00526: Syntax error on line 23 of /home1/irteam/apps/apache/conf/vhost-avatar-static.conf:
Require not allowed in <VirtualHost> context

# 해결 방법
NameVirtualHost 삭제

 

오류 12

# 오류 로그
[Thu Aug 01 16:30:33.693824 2019] [proxy_balancer:emerg] [pid 31012] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
[Thu Aug 01 16:30:33.693839 2019] [:emerg] [pid 31012] AH00020: Configuration Failed, exiting

# 해결 방법
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so 추가.

 

오류 13

# 오류 로그
[Thu Aug 01 16:32:06.814692 2019] [jk:warn] [pid 31220] No JkShmFile defined in httpd.conf. Using default /home1/irteam/apps/apache/logs/jk-runtime-status
[Thu Aug 01 16:32:06.833689 2019] [jk:warn] [pid 31224] No JkShmFile defined in httpd.conf. Using default /home1/irteam/apps/apache/logs/jk-runtime-status

# 해결 방법
JkShmFile /usr/local/apache2/logs/mod_jk.shm

 

출처 : https://ssackssly.tistory.com/14

URL 주소 중 기호 부분을 두 자리의 16 진수로 변환하여 표현하고 있습니다. 
요새는 통 들여다 볼 일이 없어서 자꾸 가물거리기에 그냥 정리 해 둡니다. 
저같은 경우에는 다운로드 파일의 다이렉트 주소를 소스에서 뽑아올 때 자주 썼습니다.

%26   &
%2F   /
%3A   :
%3F   ?
%3D   =

아래는 예제입니다.

☞ 원래 주소

http://example.com/index.php?page=260&id=22

☞ 변환된 모습

http%3A%2F%2Fwww.example.com%2Findex.php%3Fpage%3D260%26id%3D22

☞ PHP 에서 원래 주소로 다시 변환하기

<?php

$raw_url = "http%3A%2F%2Fwww.example.com%2Findex.php%3Fpage%3D260%26id%3D22";

$decoded_url = rawurldecode($raw_url);

echo $decoded_url;

?>

출처: https://shinb.tistory.com/398 [신비 블로그:티스토리]