쿼리 문자열 물음표를 밑줄로 바꾸는 Nginx 다시 쓰기 규칙 http://example.com/script.php_t=12. ?URL의 공지 가로 변환 중입니다

전체 웹 사이트를 정적 HTML로 미러링하려면

내가 좋아하는 URL을 변환하고 싶습니다 http://example.com/script.php?t=12http://example.com/script.php_t=12.

?URL의 공지 가로 변환 중입니다 _.

이를 통해 nginx 또는 apache wget는 PHP 파일이 아닌 각 URL에 대해 하나의 파일 에서 얻은 원시 HTML로 디스크에서 이러한 파일을 제공 할 수 있습니다 .

Nginx URL 재 작성을 통해 그렇게 할 수 있습니까?



답변

try_files를 사용 하여이 작업을 수행했습니다.

location / {
    try_files "${uri}_${args}" 404.html;
}

그러면 “?”대신 “_”로 제공 한 패턴의 이름을 딴 디스크에서 파일을 찾습니다.

추가 구성은 이미지 또는 스타일 시트와 같은 정적 파일을 저장 한 방법에 따라 다릅니다. 다음과 같이 쿼리 문자열 양식 디스크없이 읽도록 대체를 추가 할 수 있습니다.

location / {
    try_files "${uri}_${args}" $uri 404.html;
}

답변

라인을 따라 뭔가 :

location ~ \.php$ {
  # only rewrite URL's with args
  if ($args != '') {
    rewrite .* "${uri}_${args}?" last;
  }
}

답변

바닐라 nginx 로이 작업을 수행 할 수는 없다고 생각하지만 nginx 용 Lua 모듈을 설치하려는 경우 ( http://wiki.nginx.org/HttpLuaModule ) 할 수 있습니다.

server {
    server_name so.dev;
    listen 80;

    location / {

        root /tmp;

        rewrite_by_lua '
            local uri = ngx.var.uri
            local params = ngx.req.get_uri_args(0)

            for key, value in pairs(params) do
                uri = string.format("%s_%s=%s", uri, key, value)
            end

            ngx.req.set_uri(uri)
            ngx.req.set_uri_args({})
        ';

    }
}

로컬에서 테스트했으며 원하는 것을하는 것 같습니다. 다른 매개 변수를 앰퍼샌드로 구분하여 유지하려면 rewrite_by_lua 블록을 다음과 같이 변경하십시오.

local uri = ngx.var.uri
local param_string = ""
local params = ngx.req.get_uri_args(0)
local separator = ""

for key, value in pairs(params) do
    param_string = param_string .. separator .. key .. "=" .. value
    separator = "&"
end

ngx.req.set_uri(uri .. "_" .. param_string)
ngx.req.set_uri_args({})

답변

이것은 nginx / 1.6.2에서 작동합니다.

rewrite ^/.*\.php$ "${uri}_${args}";

그러나 개인적 으로 어떤 경우에는try_files 원래 URI로 대체되는 솔루션을 사용 합니다 .

try_files $uri "${uri}_${args}";

예를 들어 script.php디스크에 있으면 먼저 시도해보고 아무것도 없으면으로 이동합니다 script.php_t=12. try_files최신 버전의 nginx가 필요합니다.

그리고 이것이 충분하지 않으면 다음과 같이 할 수 있습니다 if:

return 301 "${uri}_${args}";

답변

위키는 말한다

?를 지정하면? 다시 쓰기가 끝나면 Nginx는 원래 $ args (인수)를 삭제합니다.

그럼 rewrite ^ ${uri}_$args? last;작동해야합니다.


답변

위에서 제안한 답변이 효과가 있습니다. 그러나 URL이 얼마나 민감한 지 알 수 있습니다. nginx는 파일 이름이 서버에 먼저 존재하는지 확인하려고 시도하기 때문에 추가 매개 변수가 파일을 제거합니다.

http://example.com/script.php?t=12 // works
http://example.com/script.php?t=12&_utm=twitter // not work

내 제안은 URL을 그대로두고 php로 올바른 파일로 라우팅하는 것입니다. t매개 변수에 액세스 할 수 있습니다 .