问题
I've got an nginx on my server and I am trying to get it to open the file '/config/www/pp1/index.php
' for address https://example.com/pp1 and '/config/www/interpreter/index.html
' for https://example.com/interpreter. Furthermore all things like https://example.com/interpreter/res/docs should fire up '/config/www/interpreter/res/docs.html
'. I have made many attempts. Currently my default config file in /site-confs looks like this:
server {
listen 80;
listen 443 ssl http2;
server_name kni.mini.pw.edu.pl;
# Path for SSL config/key/certificate
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
location / {
proxy_read_timeout 90;
proxy_connect_timeout 90;
proxy_redirect off;
proxy_pass http://kni_website;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
location /pp1 {
root /config/www;
index index.html index.htm index.php;
try_files $uri $uri/ index.php $uri/index.php /config/www/pp1/index.php index.php; #/index.php?$args =404;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php5-cgi alone:
fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}
location /interpreter {
if ($request_uri ~* "([^/]*$)" ) {
set $last_path_component $1;
}
root /config/www;
index index.html index.htm index.php $last_path_component.html;
try_files /interpreter/res/$last_path_component.html $uri.html $uri.html $uri $uri/ /index.html index.php /$uri.html /index.php?$args =404;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php5-cgi alone:
fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}
}
server {
listen 80 default_server;
listen 443 ssl;
root /config/www;
index index.html index.htm index.php;
server_name _;
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
client_max_body_size 0;
location / {
try_files $uri $uri/ /index.html /index.php?$args =404;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php5-cgi alone:
fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}
Quite frankly, I thought I knew what I was doing, however right now I am pretty certain that the location block location /interpreter
is not being checked at all and the insides of location /pp1
are causing some crazy mumbo-jumbo.
Please help a newbie in need!
回答1:
The main problem is that try_files
will process its file elements within the current context, so you cannot handle your .html
and .php
URIs in the same statement. See this document for details.
One solution is to use a named location to split the try_files
statement into two. First to test $uri
, $uri.html
and $uri/index.html
, then a second to test $uri.php
and $uri/index.php
.
For example:
root /path/to/root;
location /foo {
try_files $uri $uri.html $uri/index.html @php;
location ~* ^(.*)\.php$ { return 301 $1; }
}
location @php {
try_files $uri.php $uri/index.php =404;
fastcgi_pass ...;
...
}
The location ~* ^(.*)\.php$
block is added to handle URIs that end with .php
correctly. The simplest solution is to redirect them to a URI with the .php
removed.
来源:https://stackoverflow.com/questions/64742189/nginx-try-files-with-name-as-the-last-word-in-the-uri