Назад | Перейти на главную страницу

маршрутизация запроса nginx через индексный файл

Я бы хотел, чтобы nginx обработал:

http://dev.mydomain.com/about-us так как

http://dev.mydomain.com/index.cfm/about-us

При загрузке файла index.cfm Nginx также должен передавать "cgi path info" (/ about-us) для обработки на сервере. Я очень близок, но вижу некоторые неожиданные результаты.

Вот моя текущая конфигурация nginx:

server {

    listen 80 default_server;
    server_name  _;
    index  index.cfm index.html index.htm;
    root   /var/www;
    server_name_in_redirect off;

    set $path_info $request_uri;

    try_files $uri /index.cfm$args;

    location ~* \.(cfm|cfc|cfr)$ {
        proxy_pass http://127.0.0.1:8888;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header XAJP-PATH-INFO $path_info;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
        send_timeout 600;
    }

}

Это правильная маршрутизация к index.cfm, если index.cfm не указан в URL-адресе (например, в приведенном выше примере "about-us"). Однако я считаю странным то, что явные запросы на index.cfm, такие как http://dev.mydomain.com/index.cfm на самом деле предлагать пользователю загрузить файл (например, сервер не знает, как его обрабатывать).

Если я вас правильно понял, вы можете попробовать следующие настройки

server {
    listen       8989;
    server_name  localhost;

    index index.html;

    location / {
        return 301 $scheme://$http_host/index.cfm$uri;
    }

    location ~ /index.cfm {
        root /vhosts/default;
    }
}

Некоторые базовые проверки

# curl -I http://localhost:8989/
HTTP/1.1 301 Moved Permanently
Server: nginx/1.8.0
Date: Sat, 20 Feb 2016 01:40:29 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http://localhost:8989/index.cfm/


# curl -I http://localhost:8989/index.cfm/
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sat, 20 Feb 2016 01:40:37 GMT
Content-Type: text/html
Content-Length: 65
Last-Modified: Fri, 19 Feb 2016 23:27:42 GMT
Connection: keep-alive
ETag: "56c7a4ee-41"
Accept-Ranges: bytes


# curl -I http://localhost:8989/test.html
HTTP/1.1 301 Moved Permanently
Server: nginx/1.8.0
Date: Sat, 20 Feb 2016 01:40:55 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http://localhost:8989/index.cfm/test.html


# curl -I http://localhost:8989/index.cfm/test.html
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sat, 20 Feb 2016 01:41:05 GMT
Content-Type: text/html
Content-Length: 64
Last-Modified: Fri, 19 Feb 2016 23:27:36 GMT
Connection: keep-alive
ETag: "56c7a4e8-40"
Accept-Ranges: bytes


# curl -I http://localhost:8989/non_exist_file.html
HTTP/1.1 301 Moved Permanently
Server: nginx/1.8.0
Date: Sat, 20 Feb 2016 01:42:56 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http://localhost:8989/index.cfm/non_exist_file.html


# curl -I http://localhost:8989/index.cfm/non_exist_file.html
HTTP/1.1 404 Not Found
Server: nginx/1.8.0
Date: Sat, 20 Feb 2016 01:43:05 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

Я бы предпочел не делать никаких фактических перенаправлений, а просто «переписывать».

Я бы порекомендовал прочитать следующие темы

В большинстве случаев предпочтительнее возврат.

Ты на правильном пути с try_files. Но вы хотите добавить полный URL-путь, а не строку запроса, как вы это делали. Например:

try_files $uri /index.cfm$uri;