我試圖將特定 URL 限制為僅對特定 IP 位址在網路外部可用。當外部使用者嘗試存取該 URL(而不是從 IP 清單中)時,他應該會被重新導向到主頁。
這是我到目前為止所嘗試過的,但沒有任何運氣。最後一部分將每個人重新導向到主頁,無論 IP 是什麼。
<Location "/secret">
# <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
# Redirect 303 "/secret" /
# </If>
RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]
LogLevel debug rewrite:trace6
</Location>
PS:/secret URL 其實是一個虛擬 URL,並非實際存在於磁碟機上。
答案1
用於Require [ip|host|env]
指定誰有權存取您的虛擬主機或位置。
<Directory "/docroot">
Require ip 10.10.11.12
</Directory>
當涉及到重定向時,請考慮自訂錯誤頁面。這更加通用,因為每次未經授權的存取都會引發 403 錯誤,因此可以輕鬆評估。
我從來沒有在 apache 上這樣做過,但是在 nginx 上使用了這個策略。對於 apache 應該要這樣做:
ErrorDocument 403 http://homepage.example.com
自訂錯誤文件是使用 ErrorDocument 指令配置的,該指令可以在全域、虛擬主機或目錄上下文中使用。如果AllowOverride 設定為FileInfo,則可以在.htaccess 檔案中使用它。 (來自阿帕奇文件)
答案2
Apache 2.4 中的 Order、Deny 和Allow 選項已被替換為
<Directory /var/www/mysite.com/htdocs/public>
Require all granted
</Directory>
您可以透過使用以下方法明確限制位址:
<Directory /var/www/mysite.com/htdocs/public>
Require all granted
Require not ip 192.168.0.1
</Directory>
完全相反的情況也是如此,要限制所有並僅允許子集,請使用以下命令:
<Directory /var/www/mysite.com/htdocs/public>
Require host example.com
Require ip 192.168.0.1
</Directory>
更多資訊請訪問Apache 2.4 存取控製文件。
關於你的問題(由於缺乏添加評論的點而編輯了我自己的問題),你應該能夠簡單地設置一個 ErrorDocument 並將索引設置為 URL 路徑:
<Directory /var/www/mysite.com/htdocs/public>
Require host example.com
Require ip 192.168.0.1
ErrorDocument 401 /index.html
</Directory>
希望這可以幫助!
答案3
對於 Apache 2.4,您可以使用 <RequireAny>。您可以在虛擬主機或 .htaccess 檔案中執行此操作...
SetEnvIF IP xxx.xxx.xxx.xxx AllowThisIP # Or X-Real-IP
SetEnvIF IP yyy.yyy.yyy.yyy AllowThisIP
<RequireAny>
Require env AllowThisIP
Require host example.com
</RequireAny>
阿帕奇文檔https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany