自分の検索能力は低くないはずなのに、多くの情報をすぐに見つけることができず、まだ悩んでいます。
.htaccess | nginx.conf | 説明 |
---|---|---|
%{REQUEST_SCHEME} | $scheme | http /https |
%{HTTP_HOST} | $host | ドメイン /ip |
%{REQUEST_URI} | $request_uri | host/ の後ろの部分 |
%{REQUEST_FILENAME} | $request_filename | 一般的には uri と同じ? |
%{QUERY_STRING} | $args | クエリ文字列(? の後ろの部分) |
%{HTTP_USER_AGENT} | $http_user_agent | クライアントの UA |
%{REMOTE_ADDR} | $remote_addr | アクセス元 IP |
$scheme://$host/
または%{REQUEST_SCHEME}://%{HTTP_HOST}/
を使用して現在の URL を直接結合できます。
mod_rewrite 参考文書_Apache 中文文書:
https://www.apachehttpd.com/mod/mod_rewrite.html
Htaccess - THE Ultimate .htaccess tutorial with 100's of Examples:
https://www.askapache.com/htaccess/#Htaccess_Variables
一.正規表現の一致、以下のようになります:
~
大文字と小文字を区別する一致;~*
大文字と小文字を区別しない一致;!~
および!~*
大文字と小文字を区別しない不一致;
二.ファイルおよびディレクトリの一致、以下のようになります:
-f
および!-f
ファイルの存在を判断するために使用されます;-d
および!-d
ディレクトリの存在を判断するために使用されます;-e
および!-e
ファイルまたはディレクトリの存在を判断するために使用されます;-x
および!-x
ファイルが実行可能かどうかを判断するために使用されます;
三.rewrite ディレクティブの最後のパラメータはフラグマークで、フラグマークは次のようになります:
last
書き換え後の URI に新しいリクエストを発行し、最終的な効果は新しいリクエストが別のルールに一致するかどうかによって異なります。「おそらく apache の[L]
マークに相当する」break
現在のディレクティブで指定された新しい URI が最終結果です;redirect
302 一時リダイレクトを返し、ブラウザのアドレスバーにはリダイレクト後の URL が表示されます;permanent
301 永久リダイレクトを返し、ブラウザのアドレスバーにはリダイレクト後の URL が表示されます;
2022 年になって初めて、Nginx の設定では「および」「または」演算子などを直接使用できないことを知りました。
# アクセス元IPを表示するためのテスト用
location ~* ^/ip/[\d-]+ {
# default_typeはif内で使用できません
default_type text/plain;
return 200 "${remote_addr}";
}
# 特定のパスに一致する場合
# if ($uri ~* ^/SomePath) {
# ………………
# }
# -----------------
# デフォルトは0
set $pass 0;
# いずれかの条件が一致した場合、$passを1に設定します;
# 「または」演算子と同等です;
# UAを判断
if ($http_user_agent ~* Edg/\d+) {
set $pass 1;
}
# IPを判断
if ($remote_addr ~* 172.*) {
set $pass 1;
}
# 1でない場合はアクセスを拒否
if ($pass != 1) {
return 403;
}
# -----------------
set $flag 0;
# すべての条件を満たす必要があります
# 「かつ」演算子と同等です;
# UAを判断
if ($http_user_agent ~* Edg/\d+) {
set $flag "${flag}1";
}
# IPを判断
if ($remote_addr ~* 172.*) {
set $flag "${flag}1";
}
# 結果が一致しない場合はアクセスを拒否
if ($flag != "011") {
return 403;
}
Nginx で検索エンジンまたは指定された IP のみを許可する方法:
# 沈氷浮水(wdssmq)
location / {
set $pass 0;
# UAを判断
if ($http_user_agent ~* (Baiduspider|YisouSpider|360Spider|HaosouSpider|bingbot|Sosospider|Sosoimagespider|Bytespider|Sogou web spider|Sogou inst spider|Sogou News Spider|Sogou Pic Spider|Sogou Video Spider|Googlebot|Googlebot-Image|AdsBot-Google-Mobile)) {
set $pass 1;
}
# IPを判断
if ($remote_addr ~* (123.123.123.123|192.168.0.\d+)) {
set $pass 1;
}
# 1でない場合はアクセスを拒否
if ($pass != 1) {
return 403;
}
# 他のルール、仮想静的など
}