我正在尝试获取服务器上的虚荣网址。如果 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_files
and @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 应用程序一样。