我正在使用concrete5,我需要禁用/login我的网站上的url。 Nginx是我的服务器。
我到目前为止只允许访问指定的ips:
location /login { allow 5.69.34.213; allow 5.80.29.130; deny all; }
但它没有工作。 它阻止所有 ips和指定。 我究竟做错了什么?
更新我的conf文件是:
server { listen 80; server_name my_website.com; return 301 https://my_website.com$request_uri; } #HTTPS server server { listen 443 ssl; server_name my_website.com; root /var/www-staging/my_website/public_html; gzip on; gzip_proxied any; gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript text; ssl on; ssl_certificate /etc/letsencrypt/live/my_website.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/my_website.com/privkey.pem; ssl_session_timeout 5m; add_header Strict-Transport-Security "max-age=31536000"; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"; ssl_prefer_server_ciphers on; # mkdir /etc/nginx/ssl # openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 ssl_dhparam /etc/nginx/ssl/dhparam.pem; location /templates { alias /var/www-staging/my_website/templates/dist; } location / { try_files $uri /index.php$request_uri; } location ~ \.php($|/) { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param QUERY_STRING $query_string; fastcgi_intercept_errors on; fastcgi_pass unix:/run/php/php7.0-fpm.sock; include fastcgi_params; } location /login { allow 5.80.29.130; deny all; } error_log /var/log/nginx/my_website_error.log; access_log /var/log/nginx/my_website_access.log; }
nginx文档解释你的情况: http : //nginx.org/en/docs/http/request_processing.html#simple_php_site_configuration
nginx首先search由文字string给出的最具体的前缀位置,而不pipe列出的顺序如何。 在上面的configuration中,唯一的前缀位置是“/”,因为它匹配任何请求,它将被用作最后的手段。 然后nginx按照configuration文件中列出的顺序检查正则expression式给出的位置。 第一个匹配expression式会停止search,nginx会使用这个位置。 如果没有正则expression式匹配请求,那么nginx使用前面find的最具体的前缀位置。
所以下面这个声明/login只匹配没有匹配的正则expression式。 例如,如果你访问/login/login.php ,你的location ~ \.php($|/)赢得谁来处理这个请求的选举。
解决scheme1
要解决您的问题,请在php location设置此php location
location ~* /login { allow 5.80.29.130; deny all; }
解决scheme2
使用
location ^~ /login { allow 5.80.29.130; deny all; }
我自己解决了这个问题。 我有一个项目的stream浪者,我可以逐步debugging它。 PHP正在向一个永久性的API发出一个curl请求 。 我不得不设置一个超时来处理这样的行为:
curl_setopt($ch, CURLOPT_TIMEOUT, 6); $response = curl_exec($ch);
现在检查$ response是否为false (无结果)
if (!$response) { $this->writeFile('FALSE ' . $ip . ' ' . $session); } else { $this->writeFile('SUCCESS ' . $ip . ' ' . $session); }
这解决了这个问题。 fpm套接字是一个误导性的错误。 菜鸟的错误…
我必须找出如何与API交stream,显然开发人员昨天晚上改变了一些东西,并可能引入了一个错误。 它一直在工作
谢谢你们的帮助