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

Joomla «красивые URL-адреса» с nginx позволяют index.php / pretty / url, а также index.phppretty / url (обратите внимание на отсутствие косой черты)

Я пытаюсь установить свой первый стек LEMP, и после многих часов чтения он работает довольно хорошо (черт возьми, проблема с правами на запись группы www-data была сложной).

В любом случае, мой сайт Joomla теперь работает и работает лучше, чем когда-либо, но я заметил странную проблему с красивыми URL-адресами:

Если я получу доступ к www.mysite.com/index.php/some/content/alias/ все хорошо. Однако это нормально, если я получу доступ www.mysite.com/index.phpsome/content/alias/ (обратите внимание на отсутствие косой черты после index.php).

Это ожидаемое поведение? Я знаю, что конечные пользователи все равно не получат к ним доступ, но само его существование сводит меня с ума, потому что он должен выдавать 404, верно?

Это мой конфиг:

server {
    listen       80;
    server_name  domain.bla;
    return       301 http://www.domain.bla$request_uri;
}
server {
    listen 80;

    server_name www.domain.bla;

    root /home/domain/public_html;
    index index.php index.html index.html;

    #Specify a charset
    charset utf-8;

    # Custom 404 page
    error_page 404 /404.html;

    # Include the basic h5bp config set
    # The error remains if I comment this out, so that's not the problem
    include h5bp/basic.conf;

    # Enable PHP-FPM
    include fastcgi_php.conf;
}

fastcgi_php.conf:

location / {
    try_files $uri $uri/ /index.php?q=$request_uri;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /var/www/html;
}
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    # fastcgi_intercept_errors on;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

... и fastcgi_params:

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_FILENAME     $request_filename;
fastcgi_param   SCRIPT_NAME     $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/$nginx_version;

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_param   HTTPS           $https if_not_empty;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS     200;

Кстати, cgi.fix_pathinfo установлен на 0.

Есть подсказка? Заранее спасибо!

Оба URL попали в финальный try_files пункт: /index.php?q=$request_uri

Поскольку файл не существует, и единственный соответствующий блок местоположения - "/". Блок местоположения регулярного выражения изначально не соответствует, так как он не заканчивается на ".php", то есть до тех пор, пока не будет перезаписан try_files указанная выше директива.

Кроме того, ваш fastcgi_split_path_info директива на самом деле ничего не делает, поскольку URL-адреса с информацией о пути не могут соответствовать этому блоку местоположения.