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

Zend Framework не будет работать для URL-адресов с завершающей косой чертой - как настроить nginx для правильной перезаписи URL-адресов?

Я создаю nginx сервер, который будет использоваться с Zend Framework. По большей части это работает. Однако, если в конце URL есть косая черта, например http://localhost/test/ против http://localhost/test, URL с косой чертой в конце будет не работай. Это неожиданно и прискорбно. Я хочу, чтобы это работало для обоих URL-адресов.

Что мне делать, чтобы решить эту проблему? Моя конфигурация nginx:

server {

    listen 80;

    server_name mywebsite.com;
    root /var/www/site/public;

    location / {
        rewrite ^/(.*)/$ /$1;

        include /etc/nginx/fastcgi_params;
        fastcgi_param APPLICATION_ENV development;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/site/public/index.php;
      }

}

Как видите, я попытался добавить условие перезаписи, но, похоже, это не имеет значения.

Вот пара файлов конфигурации, которые я использую для приложений Zend Framework. Первый, php.conf, который я разделяю между проектами на моей рабочей станции разработчика. Я храню это в каталоге над моими sites каталог прямо в корне конфигурации nginx (например, /usr/local/etc/nginx/php.conf):

fastcgi_intercept_errors on;
# this will allow Nginx to intercept 4xx/5xx error codes
# Nginx will only intercept if there are error page rules defined
# -- This is better placed in the http {} block as a default
# -- so that in the case of wordpress, you can turn it off specifically
# -- in that virtual host's server block

location ~ \.php$
{
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    fastcgi_param APPLICATION_ENV   development;

    fastcgi_param PATH_INFO         $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED   $document_root$fastcgi_path_info;
    fastcgi_param QUERY_STRING      $query_string;
    fastcgi_param REQUEST_METHOD    $request_method;
    fastcgi_param CONTENT_TYPE      $content_type;
    fastcgi_param CONTENT_LENGTH    $content_length;
    fastcgi_param SCRIPT_NAME       $fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    fastcgi_param REQUEST_URI       $request_uri;
    fastcgi_param DOCUMENT_URI      $document_uri;
    fastcgi_param DOCUMENT_ROOT     $document_root;
    fastcgi_param SERVER_PROTOCOL   $server_protocol;
    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param SERVER_SOFTWARE   nginx;
    fastcgi_param REMOTE_ADDR       $remote_addr;
    fastcgi_param REMOTE_PORT       $remote_port;
    fastcgi_param SERVER_ADDR       $server_addr;
    fastcgi_param SERVER_PORT       $server_port;
    fastcgi_param SERVER_NAME       $server_name;

    fastcgi_read_timeout            60;

    fastcgi_pass                    127.0.0.1:9001;
    fastcgi_index                   index.php;
}

А потом server блок, который использует это:

server
{
    listen 80;
    server_name local.example.com;

    root /var/www/example/public;

    location /
    {
        index index.php;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    include php.conf;
}

В вашем случае я думаю, что ключевой бит try_files $uri $uri/ /index.php$is_args$args;, где мы просто передаем оптом URL и строку запроса index.php, и пусть он выполнит синтаксический анализ.