Joomla 与 nginx 的“pretty url”允许 index.php/pretty/url 以及 index.phppretty/url (注意没有斜线)

Joomla 与 nginx 的“pretty url”允许 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。

有什么线索吗?提前致谢!

答案1

两个 URL 都符合你的最终try_files条款:/index.php?q=$request_uri

由于文件不存在,唯一匹配的位置块是“/”。正则表达式位置块最初不匹配,因为它不以“.php”结尾,直到被try_files上面提到的指令重写。

此外,您的fastcgi_split_path_info指令实际上并没有执行任何操作,因为带有路径信息的 URL 无法与该位置块匹配。

相关内容