簡體   English   中英

Mod_rewrite從URL末尾提取IP地址並傳遞給查詢字符串變量

[英]Mod_rewrite extract IP address from end of URL and pass to query string variable

我正在嘗試編寫一個簡單的地理位置信息,它將URL末尾的IP地址傳遞給查詢字符串。

在我的apache.conf中,我有以下指令:

RewriteEngine On
RewriteBase /geo/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} .*/([0-9_._]+)/?$
RewriteRule .*  /lookup.php?ip=%1  [L,QSA]

因此,我希望擁有以下網址:

https://example.com/geo/100.101.0.101  or
https://example.com/geo/100.101.0.101/

將ipv4地址發送到:

 https://example.com/lookup.php?ip=100.101.0.101

將其與ipv6配合使用也將是一個超級好。

您的重寫不是100%准確的

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# IPv4
RewriteCond %{REQUEST_URI} ^/?geo/([0-9\.]+)/?$ [NC,OR]
# IPv6
RewriteCond %{REQUEST_URI} ^/?geo/([0-9a-f:]+)/?$ [NC]
RewriteRule ^.*$  /lookup.php?ip=%1  [L,QSA]

說明:

RewriteBase /geo/僅在您執行例如RewriteRule ^.*$ lookup.php?ip=%1 [L,QSA]lookup.php實際上在http://example.com/geo/lookup.php才有意義RewriteRule ^.*$ lookup.php?ip=%1 [L,QSA]

%{REQUEST_URI}應該以geo/<ip>開頭,具體取決於服務器的前導/是否包含。

IP僅包含數字( 0-9 ), af (僅IPv6)和. :取決於IP地址的版本(IPv4或IPv6)。

目前,還可以發送無效的格式化IP地址,例如/geo/999..777.444但我想您將在您的App中進行檢查。 但是,如果您使用/geo/xx+666=765 ,則此設置將根本不會被重寫。

如果您真的只想重寫有效的IP地址,而不必使用復雜得多的RegEx:

# IPv4 
RewriteCond %{REQUEST_URI} ^/?geo/(((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/?$ [NC,OR]
# IPv6  
RewriteCond %{REQUEST_URI} ^/?geo/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/?$ [NC]

基於來自https://stackoverflow.com/a/17871737/5427950的 RegEx

我在帶有Apache 2.4.27的Ubuntu 16.04.03 LTS服務器上進行了測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM