2011-11-22 71 views
4

我試圖實現的是使用htaccess來僅允許來自同一服務器的請求,但通過使用可用變量並且不指定IP。 目標是能夠對相應文件夾中的文件運行cron作業和ajax請求,但如果嘗試直接訪問,則返回404頁面。htaccess命令只允許來自同一服務器的請求(不指定IP)

這是我到目前爲止有:

Options -MultiViews +FollowSymLinks 
RewriteEngine On  
RewriteCond %{REMOTE_ADDR} !%{SERVER_ADDR}[NC] 
RewriteRule ^(.*)$ /error404.html [L,R=404] 

這工作得很好了阿賈克斯。它也適用於cronjobs,如果服務器碰巧使用相同的外出IP,但是如果服務器的外出IP與站點的IP不同,顯然它將失敗並返回404,因爲%{REMOTE_ADDR}%{SERVER_ADDR}不同。 一個解決方案是查看該服務器的傳出IP,並將其添加爲另一個異常。不過,我正在尋找更可重用的解決方案。我試圖使用正則表達式來匹配IP的第一部分,但我沒有這樣的運氣。真的不知道如何去做這件事。基本上與正則表達式我想要實現的是: 假設:

%{REMOTE_ADDR} = 192.322.122.50 
%{SERVER_ADDR} = 192.322.122.1 

這些是2個變量,我需要找到一個有效的比較表達式。如果IP的第一部分相同,則此表達式將返回true。

另一種方法是指定允許的範圍,但我不知道想要的範圍是什麼。我知道這是第一部分,如果SERVER_ADDR變量,但我不知道如何告訴服務器我的意思:D

希望我不是太混亂。最終,我正在尋找的是一種確定請求是否來自同一臺服務器的方法。它必須通過.htaccess文件來實現。爲什麼?由於受保護的文件夾還包含非PHP腳本的文件,所以替代方法是動態地爲所有這些文件提供服務,並在所有條件下使用PHP。使用普通的htaccess命令會更加優雅。我只是希望有一種方法可以做到這一點。

+0

你可能做的最好的事情是匹配子網(像前3個字節),但不是像1-50這樣的任意範圍。 –

+0

是匹配子網是我想要做的。我想另一種方式來說這是..你如何寫條件,所以它只允許來自同一子網的請求? 而1-50只是一個例子。以及知識產權。我試圖使代碼完全動態,所以換句話說,子網不能從字面上指定,但它必須以某種方式從SERVER_ADDR變量中提取。這是我的困境。 – Owbey

回答

1

這不是測試,但你可以給它一個嘗試,如果你想:

# note that this only works if both server and visitor are using IPv4 addresses 
RewriteCond %{SERVER_ADDR} ^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$ 
RewriteCond %{REMOTE_ADDR} !^%1\.%2\.%3\.([0-9]{1,3})$ 
RewriteRule ^.*$ error404.html [R=404,L] 

讓我知道,如果這種東西的工作,但如果它不不要拍我: )

+0

現在測試出來... – Owbey

+0

好吧,但我得到了一些意想不到的結果。意外,因爲在奇怪。感謝您的輸入。據我瞭解,您的代碼應該從SERVER_ADDR中捕獲每個字節,然後使用前3個字節與REMOTE_ADDR進行匹配。理論上這應該起作用,我想不出另一種方式去解決這個問題,但鑑於我沒有得到預期的響應,我認爲代碼本身可能需要一些調整。我會繼續努力.. – Owbey

+0

這不適合我。我不認爲%1等也擴展了。 – reinierpost

相關問題