我正在使Nginx允许任何子文件夹重定向到特定目录,但将所选的子文件夹存储在标题中。
例如,我目前有这个功能:
location ^~ /AhRnfKlM {
alias /var/www/html/admin;
index index.php index.html index.htm;
location ~ \.php$ {
limit_req zone=one burst=8;
try_files $uri =404;
fastcgi_index index.php;
fastcgi_pass php;
include fastcgi_params;
fastcgi_buffering on;
fastcgi_buffers 96 32k;
fastcgi_buffer_size 32k;
fastcgi_max_temp_file_size 0;
fastcgi_keep_conn on;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
因此,如果我转到http://website.com/AhRnfKlM/index.php,将不会有任何问题,但是我希望我能够选择任何子文件夹,例如http://website.com/test123/index.php,但它仍将正确地别名,但是将test123作为标题存储,例如作为X-AuthCode,我可以在PHP中读取它,对照允许的身份验证代码的mysql数据库进行检查,然后从那里决定要做什么。这样,我可以为特定的管理员设置特定的访问代码,或者允许存在一次访问代码,而无需使用新的别名修改NGINX。
我用正则表达式尝试了各种方法,例如:
location ~ ^(/[^/]+) {
alias /var/www/html/admin;
add_header X-AuthCode $1;
index index.php index.html index.htm;
location ~ \.php$ {
limit_req zone=one burst=8;
try_files $uri =404;
fastcgi_index index.php;
fastcgi_pass php;
include fastcgi_params;
fastcgi_buffering on;
fastcgi_buffers 96 32k;
fastcgi_buffer_size 32k;
fastcgi_max_temp_file_size 0;
fastcgi_keep_conn on;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
但无法使其正常工作!我刚刚被禁止进入403。
整个服务器块(在Ivan建议之后:
server {
listen 80;
location ~ ^/(?<authcode>[^/]+) {
alias /var/www/html/admin;
index index.php index.html index.htm;
location ~ \.php$ {
limit_req zone=one burst=8;
try_files $uri =404;
fastcgi_index index.php;
fastcgi_pass php;
include fastcgi_params;
fastcgi_buffering on;
fastcgi_buffers 96 32k;
fastcgi_buffer_size 32k;
fastcgi_max_temp_file_size 0;
fastcgi_keep_conn on;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param AUTHCODE $authcode;
}
}
}
谢谢:)
使用add_header
指令,您正在nginx从您的PHP后端收到响应后,将X-AuthCode
标头添加到用户浏览器的nginx响应中。相反,您应该做的是将带有fastcgi_param
指令的URI前缀传递给您的PHP后端,例如
location ~ ^/(?<authcode>[^/]+) {
...
location ~ \.php$ {
...
fastcgi_param AUTHCODE $authcode;
...
然后检查$_SERVER['AUTHCODE']
的内容。
但这不能回答为什么您会收到403 HTTP错误的问题。我认为您的配置中还有其他位置可以在此位置捕获请求之前捕获该请求。您能否仅在没有其他任何位置的情况下测试该位置?如果您的第一个示例可行,那么这个示例也应该可行。