2017-07-26 88 views
2

我想重定向所有內容:國防部重寫重定向,但避免直接訪問

www.example.com/public/... 

但防止

www.example.com/public/file1/ 
www.example.com/public/file2/ 
etc 

直接進入最終的網址應爲:

www.example.com/file1/ 

我試過這個重定向和它的作品 - 但我不知道如何防止直接訪問:

ReWriteCond %{REQUEST_URI} !/public/ 
RewriteRule ^(.*) public/$1 [L] 
+1

歡迎來到Stack Overflow!在編輯之前,您可能會收到一些降薪,因爲您最初的問題缺乏任何研究工作。我建議你參加[歡迎導覽](https://stackoverflow.com/tour),並在[幫助頁面]上閱讀[提問問題](https://stackoverflow.com/help/asking)( https://stackoverflow.com/help)。 –

回答

1

也許你應該弄清楚什麼是預期的行爲,當用戶試圖達到真正的網址:

www.example.com/public/file1/ 

如果防止你的意思是保佑,你可以添加一個規則與403

迴應
<IfModule mod_rewrite.c> 
RewriteEngine On 

RewriteCond %{REQUEST_URI} !/public/ 
RewriteRule ^(.*)$ /public/$1 [L] 

RewriteCond %{REQUEST_URI} /public/ 
RewriteRule ^(.*)$/[R=403,L] 
</IfModule> 

更新:上述解決方案不起作用!

我意識到我以前的解決方案總是拋出403,所以它是毫無價值的。實際上,這有點棘手,因爲重定向本身在URL中確實包含/public/

,真正爲我工作的解決方案是一個祕密查詢字符串追加到重定向和檢查上的URL包含/public/這個值:

<IfModule mod_rewrite.c> 
RewriteEngine On 

RewriteCond %{REQUEST_URI} !/public/ 
RewriteRule ^(.*)$ /public/$1?token=SECRET_TOKEN [L] 

RewriteCond %{REQUEST_URI} /public/ 
RewriteCond %{QUERY_STRING} !token=SECRET_TOKEN 
RewriteRule ^(.*)$/[R=403,NC,L] 
</IfModule> 

這樣www.example.com/file1/將顯示file1,但www.example.com/public/file1/會拋出403 Forbidden錯誤響應。

擔憂安全這個SECRET_TOKEN在這裏討論:How secure is to append a secret token as query string in a htaccess rewrite rule?


如果你的URL的預期有它自己的查詢字符串,如www.example.com/file1/?param=value一定要加的標誌QSA

RewriteRule ^(.*)$ /public/$1?token=SECRET_TOKEN [QSA,L] 
+1

我覺得這應該可以通過設置和測試[變量](https://httpd.apache.org/docs/2.4/env.html)而不是查詢字符串,但我似乎無法得到它工作。 – HullCityFan852

+0

哦,那真的很酷@HellCityFan852請隨時編輯答案或評論您獲得的任何成功! –