是在在本地用虛擬機(jī)中通過yum安裝nginx的,安裝一切正常,但是訪問時(shí)報(bào)403,
于是查看nginx日志,路徑為/var/log/nginx/error.log。打開日志發(fā)現(xiàn)報(bào)錯(cuò)Permission denied,詳細(xì)報(bào)錯(cuò)如下:
1. open() "/data/www/1.txt" failed (13: Permission denied), client: 192.168.1.194, server: www.web1.com, request: "GET /1.txt HTTP/1.1", host: "www.web1.com"
沒有權(quán)限?于是找了不少資料,可以通過下面四步排查解決此問題。你可能只是其中之前配置有問題,不一定四個(gè)步驟都用上。
一、由于啟動(dòng)用戶和nginx工作用戶不一致所致
1.1查看nginx的啟動(dòng)用戶,發(fā)現(xiàn)是nobody,而為是用root啟動(dòng)的
命令:ps aux | grep "nginx: worker process" | awk'{print }'
1.2將nginx.config的user改為和啟動(dòng)用戶一致,
命令:vi conf/nginx.conf
二、缺少index.html或者index.php文件,就是配置文件中index index.html index.htm這行中的指定的文件。
1. server {2. listen 80;3. server_name localhost;4. index index.php index.html;5. root /data/www/;6. }
如果在/data/www/下面沒有index.php,index.html的時(shí)候,直接文件,會(huì)報(bào)403 forbidden。
三、權(quán)限問題,如果nginx沒有web目錄的操作權(quán)限,也會(huì)出現(xiàn)403錯(cuò)誤。
解決辦法:修改web目錄的讀寫權(quán)限,或者是把nginx的啟動(dòng)用戶改成目錄的所屬用戶,重啟Nginx即可解決
1. chmod -R 777 /data2. chmod -R 777 /data/www/
四、SELinux設(shè)置為開啟狀態(tài)(enabled)的原因。
4.1、查看當(dāng)前selinux的狀態(tài)。
1. /usr/sbin/sestatus
4.2、將SELINUX=enforcing 修改為 SELINUX=disabled 狀態(tài)。
1. vi /etc/selinux/config2.3. #SELINUX=enforcing4. SELINUX=disabled
4.3、重啟生效。reboot。
1. reboot
ginx不僅僅只是一款反向代理和負(fù)載均衡服務(wù)器,它還能提供很多強(qiáng)大的功能,例如:限流、緩存、黑白名單和灰度發(fā)布等等。在之前的文章中,我們已經(jīng)介紹了Nginx提供的這些功能。今天,我們來介紹Nginx另一個(gè)強(qiáng)大的功能:禁用IP和IP段。
禁用IP和IP段
Nginx的ngx_http_access_module 模塊可以封配置內(nèi)的ip或者ip段,語法如下:
deny IP;
deny subnet;
allow IP;
allow subnet;
# block all ips
deny all;
# allow all ips
allow all;
如果規(guī)則之間有沖突,會(huì)以最前面匹配的規(guī)則為準(zhǔn)。
配置禁用ip和ip段
下面說明假定nginx的目錄在/usr/local/nginx/。
首先要建一個(gè)封ip的配置文件blockips.conf,然后vi blockips.conf編輯此文件,在文件中輸入要封的ip。
deny 1.2.3.4;
deny 91.212.45.0/24;
deny 91.212.65.0/24;
然后保存此文件,并且打開nginx.conf文件,在http配置節(jié)內(nèi)添加下面一行配置:
include blockips.conf;
保存nginx.conf文件,然后測(cè)試現(xiàn)在的nginx配置文件是否是合法的:
/usr/local/nginx/sbin/nginx -t
如果配置沒有問題,就會(huì)輸出:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful
如果配置有問題就需要檢查下哪兒有語法問題,如果沒有問題,需要執(zhí)行下面命令,讓nginx重新載入配置文件。
/usr/local/nginx/sbin/nginx -s reload
僅允許內(nèi)網(wǎng)ip
如何禁止所有外網(wǎng)ip,僅允許內(nèi)網(wǎng)ip呢?
如下配置文件
location / {
# block one workstation
deny 192.168.1.1;
# allow anyone in 192.168.1.0/24
allow 192.168.1.0/24;
# drop rest of the world
deny all;
}
上面配置中禁止了192.168.1.1,允許其他內(nèi)網(wǎng)網(wǎng)段,然后deny all禁止其他所有ip。
格式化nginx的403頁面
如何格式化nginx的403頁面呢?
首先執(zhí)行下面的命令:
cd /usr/local/nginx/html
vi error403.html
然后輸入403的文件內(nèi)容,例如:
<html>
<head><title>Error 403 - IP Address Blocked</title></head>
<body>
Your IP Address is blocked. If you this an error, please contact binghe with your IP at test@binghe.com
</body>
</html>
如果啟用了SSI,可以在403中顯示被封的客戶端ip,如下:
Your IP Address is <!--#echo var="REMOTE_ADDR" --> blocked.
保存error403文件,然后打開nginx的配置文件vi nginx.conf,在server配置節(jié)內(nèi)添加下面內(nèi)容。
# redirect server error pages to the static page
error_page 403 /error403.html;
location = /error403.html {
root html;
}
然后保存配置文件,通過nginx -t命令測(cè)試配置文件是否正確,若正確通過nginx -s reload載入配置。
HTMLAgilityPack 是一個(gè)開源的.NET庫,旨在幫助開發(fā)人員處理和操作HTML文檔。它提供了解析HTML文檔、查詢DOM元素以及修改HTML內(nèi)容的功能。HTMLAgilityPack 基于XPath和LINQ查詢,使得開發(fā)者能夠以類似于操作XML文檔的方式來操作HTML文檔。這使得從復(fù)雜的HTML結(jié)構(gòu)中提取所需數(shù)據(jù)變得輕而易舉。
以下是一些常用的HTMLAgilityPack方法和屬性,以及它們的用途:
我們使用 HttpClient 發(fā)送一個(gè) GET 請(qǐng)求到指定的 HTTPS URL,并且讀取返回的響應(yīng)內(nèi)容。
如果出現(xiàn) HTTP 狀態(tài)碼 403 (Forbidden) 錯(cuò)誤表示您的請(qǐng)求被服務(wù)器拒絕,通常是因?yàn)榉?wù)器認(rèn)為您沒有權(quán)限訪問該資源。
private async void btnGetTitle_Click(object sender, EventArgs e)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
string htmlContent = "";
using (HttpClient httpClient = new HttpClient())
{
try
{
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
HttpResponseMessage response = await httpClient.GetAsync("https://www.baidu.com");
//檢查 HTTP 響應(yīng)的狀態(tài)碼是否表示成功
response.EnsureSuccessStatusCode();
//讀取內(nèi)容
byte[] bytes = await response.Content.ReadAsByteArrayAsync();
htmlContent = Encoding.UTF8.GetString(bytes);
}
catch (HttpRequestException ex)
{
}
}
doc.LoadHtml(htmlContent);
HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
if (titleNode != null)
{
string title = titleNode.InnerText;
MessageBox.Show($"頁面標(biāo)題:{title}");
}
}
/// <summary>
/// 通過url取得html內(nèi)容
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private async Task<string> GetHtml(string url)
{
string htmlContent = "";
using (HttpClient httpClient = new HttpClient())
{
try
{
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
HttpResponseMessage response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
//讀取內(nèi)容
byte[] bytes = await response.Content.ReadAsByteArrayAsync();
htmlContent = Encoding.UTF8.GetString(bytes);
}
catch (HttpRequestException ex)
{
}
}
return htmlContent;
}
private async void btnGetLinks_Click(object sender, EventArgs e)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
string htmlContent =await GetHtml("https://www.baidu.com");
doc.LoadHtml(htmlContent);
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
if (linkNodes != null)
{
foreach (HtmlNode linkNode in linkNodes)
{
string link = linkNode.GetAttributeValue("href", "");
lstLink.Items.Add(link);
}
}
}
private async void btnGetSpecialLink_Click(object sender, EventArgs e)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
string htmlContent = await GetHtml("https://news.baidu.com/");
doc.LoadHtml(htmlContent);
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//*[@id=\"pane-news\"]/ul/li[@class=\"bold-item\"]/a");
if (linkNodes != null)
{
foreach (HtmlNode linkNode in linkNodes)
{
string link = linkNode.GetAttributeValue("href", "");
string title = linkNode.InnerText;
lnkSpecialLink.Items.Add(title + " " + link);
}
}
}
快速找到節(jié)點(diǎn)path
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。