英文:
Direct all path and file calls to /index.php if not found with nginx
问题
我试图使所有路径和文件请求都直接指向 /index.php,如果它们不存在。
当前根目录(/var/www/mysite.local/html/public/)只有一个文件(index.php),没有子目录。
目标是,除非路径和/或文件名存在,无论路径或文件名是什么,无论扩展名是什么(.php .jpg .gif .html .whatever),请求都应该指向 /index.php
目前,这仅适用于路径(/ 或 /something/or/other/)。
这是我在 /etc/nginx/sites-available/mysite.local 中的配置:
server {
listen 80;
root /var/www/mysite.local/html/public/;
index index.php;
server_name mysite.local;
access_log /var/log/nginx/mysite_local.access.log;
error_log /var/log/nginx/mysite_local.error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
有人可以告诉我需要做哪些更改来实现我的目标吗?
谢谢。
英文:
I'm attempting to make all path and file requests direct to /index.php if they do not exist.
Currently the root (root /var/www/mysite.local/html/public/) only has one file (index.php) and no sub-directories.
The goal is that unless a path and/or file name exist, no matter what the path(s) or filename are, regardless of extension (.php .jpg .gif .html .whatever), the request should direct to /index.php
Currently this only works for paths (/ or /something/or/other/).
This is what I have for my /etc/nginx/sites-available/mysite.local
server {
listen 80;
root /var/www/mysite.local/html/public/;
index index.php;
server_name mysite.local;
access_log /var/log/nginx/mysite_local.access.log;
error_log /var/log/nginx/mysite_local.error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
Can someone tell me what changes I need to make to accomplish my goal?
Thank you.
答案1
得分: 1
由于它仅适用于路径,这就是为什么它仅在该位置块上工作的原因。您的 try_files $uri $uri/ /index.php?$args;
应该正好做您想要的事情。问题在于,由于由nginx定义的重要性顺序,nginx将最后检查此位置块,具体请参考:https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms#how-nginx-chooses-which-location-to-use-to-handle-requests
因此,如果您访问任何 .js 文件,您将跳转到最后一个位置块,而没有定义它应该使用 index.php 作为后备。我认为将 try_files $uri $uri/ /index.php?$args;
添加到每个位置块应该可以解决您的问题。尽管它可能无法在php位置块内工作。
英文:
The reason why its only working for paths is, that it's only working for that location block. Your try_files $uri $uri/ /index.php?$args;
should be doing exactly what you want. The "proplem" is, that nginx will check this location block last, due to the importance order defined by nginx: https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms#how-nginx-chooses-which-location-to-use-to-handle-requests
So if you access any .js file, you will jump into the last location block and there is nowhere defined it should use the index.php as fallback. I think adding the try_files $uri $uri/ /index.php?$args;
to every location block should solve your problem. Tho it might not work inside the php location block.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论