전체 웹 사이트를 정적 HTML로 미러링하려면
내가 좋아하는 URL을 변환하고 싶습니다 http://example.com/script.php?t=12
에 http://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}";
답변
답변
위에서 제안한 답변이 효과가 있습니다. 그러나 URL이 얼마나 민감한 지 알 수 있습니다. nginx는 파일 이름이 서버에 먼저 존재하는지 확인하려고 시도하기 때문에 추가 매개 변수가 파일을 제거합니다.
http://example.com/script.php?t=12 // works
http://example.com/script.php?t=12&_utm=twitter // not work
내 제안은 URL을 그대로두고 php로 올바른 파일로 라우팅하는 것입니다. t
매개 변수에 액세스 할 수 있습니다 .