[英]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.