DokuWiki

It's better when it's simple

사용자 도구

사이트 도구


ko:rewrite

URL Rewriting

기본적으로 DokuWiki는 다음처럼 URLs에서 URL rewriting을 쓰지 않습니다: http://example.com/doku.php?id=page. 이 URL들은 보기 안좋은 형태로 간주되며 어떤 검색엔진에서는 색인 생성이 제대로 되지 않습니다. 해결 방법은 URL rewriting을 사용하면 됩니다. DokuWiki는 userewrite 옵션을 통해 URL rewriting을 쓰기 위한 두가지 방법을 지원합니다. 한가지는 웹서버의 rewriting기능을 사용하는 것이고 다른 하나는 DokuWiki자체에서 지원하는 방법입니다. 아래 표는 모든 가능한 옵션을 다시 설명합니다.

정보 URL
0 URL rewriting 사용 안함(기본). http://example.com/dokuwiki/doku.php?id=wiki:syntax
1 웹서버를 통한 Rewriting http://example.com/dokuwiki/wiki:syntax
2 DokuWiki를 통한 Rewriting http://example.com/dokuwiki/doku.php/wiki:syntax

URL-Rewriting은 몇가지 추가적인 옵션 설정이 필요하므로 기본적으로 금지되어 있습니다. - 옵션들에 대한 자세한 사항들은 아래에서 논의되고 있습니다.

옵션 1: 웹서버

$conf['userewrite'] = 1;

이 옵션은 보기좋은 URL을 만들지만 웹서버가 rewritten URL을 파싱하도록 설정해야 하고 DokuWiki에게 파싱처리된(deconstructed)URL을 넘겨줍니다.

Apache

아파치는 Apache 1Apache 2 mod_rewrite 모듈을 통해 Rewriting URL을 파싱합니다. 서버의 주 환경 설정 파일이나 DokuWiki의 주 디렉토리 내의 .htaccess파일을 통해 정의된 규칙에 의해 모듈의 설정이 이루어지게 됩니다.

DokuWiki는 기본적으로 rewrite 규칙(mod 1)을 가지고 있는 .htaccess.dist 파일과 함께 배포됩니다. rewriting을 가능하게 하려면 파일을 .htaccess로 복사( doku.php파일을 포함한 폴더로, debian 사용자는 제외)하고 주석처리된 규칙들의 주석표시를 제거합니다.

RewriteEngine on
 
RewriteBase /dokuwiki
 
RewriteRule ^_media/(.*)              lib/exe/fetch.php?media=$1  [QSA,L]
RewriteRule ^_detail/(.*)             lib/exe/detail.php?media=$1  [QSA,L]
RewriteRule ^_export/([^/]+)/(.*)     doku.php?do=export_$1&id=$2  [QSA,L]
RewriteRule ^$                        doku.php  [L]
RewriteCond %{REQUEST_FILENAME}       !-f
RewriteCond %{REQUEST_FILENAME}       !-d
RewriteRule (.*)                      doku.php?id=$1  [QSA,L]
RewriteRule ^index.php$               doku.php

RewriteBase /dokuwiki이 있는 행에서, /dokuwiki를 URL상에서 Wiki로 접근하는데 쓰인 디렉토리로 교체합니다. 옵션 0일 때의 보통 URL형태가 http://www.whatever.com/projects/documents/doku.php라면 RewriteBase /projects/documents로 교체하면 됩니다. 어쨋거나 때때로 이 행은 전혀 필요하지 않습니다.

주의할 점들

.htaccess 파일은 아파치의 주 환경 파일이 허용하는 경우에만 쓸모가 있습니다. 많은 기본 아파치 설정은 사용하지 않게 되어있습니다. 만일 .htaccess가 동작하게 하고 싶다면 다음 부분을 httpd.conf에 추가합니다:

<Directory /path/to/dokuwiki>
  AllowOverride All
</Directory>

상대적으로 위에 언급된 규칙을 직접 httpd.conf에 간단하게 기술할 수도 있습니다:

<Directory /path/to/dokuwiki>
  RewriteEngine on
  ... rewrite rules here ...
</Directory>

수정을 한 뒤에는 아파치를 다시 시작해야합니다. 어떤 사용자들은 rewrite기능을 활성화한 뒤로 “403 - Forbidden”에러를 보게된다고 합니다. 이 문제를 해결하려면 다음의 FollowSymlinks 옵션을 설정해야 합니다:

Options +FollowSymlinks
RewriteEngine on
 
...etc.

위에 설정된 규칙은 모든 존재하지 않는 파일과 디렉토리를 DokuWiki의 주 dispatcher로 매핑합니다. 이 것은 가상 매핑(alias)에도 적용됩니다. 예를 들면 어떤 호스트들은 웹 접근 통계를 가상의 /stats 디렉토리에 매핑합니다. 가상 디렉토리에 접근하게 하려면, rewrite 조건에서 그들을 제외시킬 필요가 있습니다.

예:

...
RewriteCond %{REQUEST_FILENAME}       !-f
RewriteCond %{REQUEST_FILENAME}       !-d
RewriteCond %{REQUEST_URI} !^/stats/(.*)$
...

IIS

IIS는 rewrite 모듈을 표준으로 지원하고 있지 않습니다. ISAPI Rewrite Lite(free)은 다음의 rewrite 규칙과 함께 성공적으로 동작됩니다. (C:\Program Files\Helicon\ISAPI_Rewrite\httpd.ini파일 참조):

# Dokuwiki rules
# Fix RSS Feeds
RewriteRule ^(/wiki/)feed.php $1/feed.php [I,L]
RewriteRule ^(/wiki/)feed.php\?(.*) $1/feed.php\?mode=$2&$3 [I,L]
 
RewriteRule ^(/wiki/)_media/(.*)\?(.*) $1lib/exe/fetch.php\?media=$2&$3 [I,L]
RewriteRule ^(/wiki/)_detail/(.*)\?(.*) $1lib/exe/detail.php\?media=$2&$3 [I,L]
RewriteRule ^(/wiki/)_detail/(.*) $1lib/exe/detail.php\?media=$2 [I,L]
RewriteRule ^(/wiki/)_export/([^/]+)/(.*) $1doku.php?do=export_$2&id=$3 [I,L]
 
RewriteRule (/wiki/) $1doku.php [I,L]
 
RewriteRule ^(/wiki/)\?idx=(.*) $1doku.php\?idx=$2 [I,L]
RewriteRule ^(/wiki/)lib/(.*) $1lib/$2 [I,L]
RewriteRule ^(/wiki/)(.*)\?do=(.*) $1doku.php\?id=$2&do=$3 [I,L]
RewriteRule ^(/wiki/)doku.php\?id=(.*) $1doku.php\?id=$2 [I,L]
RewriteRule ^(/wiki/)(.*) $1doku.php\?id=$2 [I,L]
 
# this rule fixes a problem to see the old revisions
RewriteRule ^(/wiki/)(.*)\?(.*) $1doku.php\?id=$2&$3 [I,L]
 
# Diff still broken unless none is selected under 'use nice URL' options. You can still enter and link to nice URLs but the Dokuwiki program will use normal naming.

모든 RewriteRule ^(/wiki/)이 있는 행들에서, (/wiki/)를 URL상에서 Wiki로 접근하는데 쓰인 디렉토리로 교체합니다.
옵션 0일 때의 보통 URL형태가 http://www.whatever.com/projects/documents/doku.php라면 ^(/projects/documents/)로 교체하면 됩니다.

Lighttpd

이 것은 suggested for lighty 의 개선된 버전입니다.

url.rewrite-once = (                                                                                                   
                    "^(/|index.php)?$" => "/doku.php",                                                                     
                    "^/lib/(.*)/?$" => "/lib/$1",
                    "^/_media/(.*)?\?(.*)$" => "/lib/exe/fetch.php?media=$1&$2",
                    "^/_media/(.*)$" => "/lib/exe/fetch.php?media=$1",
                    "^/_detail/(.*)?\?(.*)$" => "/lib/exe/detail.php?media=$1&$2",
                    "^/_detail/(.*)?$" => "/lib/exe/detail.php?media=$1",
                    "^/_export/([^/]+)/(.*)$" => "/doku.php?do=export_$1&id=$2",
                    "^/(?!doku.php|feed.php|robots.txt|sitemap.xml.gz)(.*)\?(.*)/?$" => "/doku.php?id=$1&$2",
                    "^/(?!doku.php|feed.php|robots.txt|sitemap.xml.gz|lib|_media|_detail|_export)(.*)/?$" => "/doku.php?id=$1",
                  )

Nginx

Nginx는 아주 빠르고 안정적인 httpd입니다. 자세한 정보는 nginx projectwiki를 참고하기 바랍니다. 다음의 예에서 server root는 /var/www이며 dokuwiki를 /var/www/dokuwiki로 풀어낼 수 있습니다.

    server {
        listen       80;
        server_name  _ *;
        port_in_redirect off;
        optimize_server_names off;

        access_log  /var/log/nginx/localhost.access.log;

        rewrite ^(/dokuwiki/)_media/(.*) $1lib/exe/fetch.php?media=$2 last;
        rewrite ^(/dokuwiki/)_detail/(.*) $1lib/exe/detail.php?media=$2 last;
        rewrite ^(/dokuwiki/)_export/([^/]+)/(.*) $1doku.php?do=export_$2&id=$3 last;

        location / {
            root   /var/www;
            index  index.html index.htm index.php;
        }

        location /dokuwiki/ {
            if (!-f $request_filename) {
                rewrite ^(/dokuwiki/)(.*)?(.*)  $1doku.php?id=$2&$3 last;
                rewrite ^(/dokuwiki/)$ $1doku.php last;
            }
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /var/www;
        }

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:8888;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
            include        /etc/nginx/fastcgi_params;
        }
    }

주의

Nginx는 fastcgi를 완벽하게 지원합니다. 설정하기 위해선 nginx fastcgi문서를 참고합니다.

위치 설정 전에 rewrite규칙의 마지막 키워드는 단지 한번만 일어나도록 보장해줍니다. 먼저 위 코드 상의 모든 /dokuwiki/를 웹서버 루트 디렉토리의 위키 상대경로로 전부 바꿉니다.

Option 2: DokuWiki

$conf['userewrite'] = 2;

이 옵션은 웹서버를 따로 설정할 필요가 없습니다. 어찌되었든 아파치에서 구현된 CGI표준의 PATH_INFO 기능에 의존적입니다. IIS는 이 설정으로는 동작하지 않습니다. bug 이 옵션과 apache의 Alias directive를 같이 사용하면 문제가 발생합니다!

Clean PHP 세션 ID

“명백한”URL을 사용했음에도 불구하고, 아래처럼 보이는 URL상의 “DokuWiki”인자를 볼지도 모릅니다:

PHP session ID:

http://example.com/example?DokuWiki=c81a95369a66576982119e2a60b557a5

이 인자는 PHP가 자동적으로 추가한 PHP 세션 ID입니다. 이 것은 rewriting과 전혀 상관없습니다. 이 문제를 피하려면 PHP가 강제로 session.use_only_cookies PHP 옵션을 설정하여 강제로 세션을 위한 쿠키를 언제나 사용하도록 합니다.

보통 php.ini설정 파일에서 변경이 가능합니다.(웹 호스트를 사용할 때, 지원 페이지의 존재 여부와 그 값을 어떻게 수정할 수 있는지 검사합니다.) :

session.use_only_cookies=1

만일 아직도 세션 ID가 동작된다면:

session.use_trans_sid=0

PHP가 아파치 모듈로서 사용된다면 .htaccess파일에서 다음 문법을 사용하여 바꿀 수 있습니다.

php_flag session.use_only_cookies on

번역

english version: dokuwiki-2006-11-06.

Add your email here if you created translated or modified whole or part of this page.

  • jk Lee - real mail domain is gmail, not zoo.com for spam filtering 2007-2-7 created
ko/rewrite.txt · 마지막으로 수정됨: 2018-04-24 06:44 저자 gibomi

별도로 명시하지 않을 경우, 이 위키의 내용은 다음 라이선스에 따라 사용할 수 있습니다: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki