当文件不存在时,NGINX 重写虚荣 URL(try_files 和 rewrite 一起使用)

当文件不存在时,NGINX 重写虚荣 URL(try_files 和 rewrite 一起使用)

我正在尝试获取服务器上的虚荣网址。如果 URL 中的文件路径不存在,我想将 URL 重写为 profile.php,但如果我的用户的用户名中有句点,他们的虚荣网址就不起作用。

这是我的配置文件块。

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

    rewrite ^/([a-zA-Z0-9-_]+)$ /profile.php?url=$1 last;

    root   /var/www/html/example.com;
    error_page 404 = /404.php;

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 1y;
        log_not_found off;
    }

    location ~ \.php$ {
        fastcgi_pass  example_fast_cgi;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/example.com$fastcgi_script_name;
        include        fastcgi_params;
    }

    location / {
        index  index.php index.html index.htm;
    }

    location ~ /\.ht {
        deny  all;
    }

    location /404.php {
        internal;
        return 404;
    }
}

任何帮助都将不胜感激。谢谢!

答案1

您可能可以使用try_filesand @LOCATION。如下所示(简化的、未经测试的示例):

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

    root /var/www/html/example.com;
    index index.php index.html index.htm;

    location / {
        try_files /$uri @PROFILEALIAS;
    }

    location ~ \.php$ {
        fastcgi_pass example_fast_cgi;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location @PROFILEALIAS {
        fastcgi_pass example_fast_cgi;
        fastcgi_param SCRIPT_FILENAME $document_root/profile.php;
        fastcgi_param QUERY_STRING url=$uri;
        include fastcgi_params;
    }
}

诀窍try_files是避免将静态文件请求作为个人资料页面发送到 PHP。可以使用正则表达式位置完成类似的事情,但这样做效率更高。

答案2

\.如果正则表达式中的用户名有效,则可以添加句点。

但最好的方法是使用前端控制器模式在您的应用程序内处理这些问题,就像许多其他流行的 Web 应用程序一样。

相关内容