清理 nginx 上的 URL 和 php 扩展

清理 nginx 上的 URL 和 php 扩展

我在网上查看了几十个其他问题和参考资料 - 根据我的所有计算,我的设置应该可以工作,但事实并非如此。

我安装了带有 php-fpm 的 nginx。如果我尝试访问 .php 文件,它会正确运行并获得正确的结果。我的配置文件中出现了以下内容:

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

现在,我想设置我的 Web 应用,使其/somedir/file自动执行/somdir/file.php,同时仍显示/somdir/file在浏览器的地址栏中。因此,我修改了配置,使其包含以下内容:

location / {
    try_files $uri $uri/ $uri.php?query_string
}

有点儿有效,即服务器确实访问了 .php 文件。但是,它不是使用location ~ \.php$上面现有的块来执行它,而是简单地将 php 源代码作为下载内容吐入浏览器。如果我手动将 .php 附加到请求的 URL,那么 php 就会被执行。

感觉好像一旦服务器匹配try_files$uri.php,它就不会再在位置执行另一次传递来查看它需要对 php 文件执行的操作。我尝试将 php 块放在 的上方和下方location /,但没有任何区别。

我怎样才能让 php 执行?

答案1

您是否尝试过该rewrite指令?例如:

location / {
    try_files $uri $uri/ @extensionless-php;
    index index.html index.htm index.php;
} 

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

来源:http://www.tweaktalk.net/60/nginx-remove-php-file-extension-from-url

答案2

try_files总是在当前上下文中执行,这就是为什么它服务于你的php-脚本作为纯文本文件- 当前位置缺少fastcgi_passtry_files是邪恶的,因为它不会直截了当,而是会产生可疑的阻碍,请避免这样做。

在同一时间正则表达式-位置优先于普通位置,这就是为什么当您反转顺序时什么也不会改变。

我个人认为.php从地址栏隐藏扩展是没用的,因为它会在配置文件中添加更多代码。

相关内容