2016-02-14 78 views
2

我有一個使用Laravel 5作爲API的應用程序。我在我的.htaccess中的所有路由重定向到https:Laravel 5 - htaccess在帖子路徑上的HTTPS重定向不起作用。

RewriteEngine On 

    # Force SSL 
    RewriteCond %{HTTPS} !=on 
    RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

這正常以下:

https://example.com/route

而是拋出一個MethodNotAllowedHttpException,如果我嘗試訪問它HTTP。它正確地重定向到https,但似乎沒有正確跟在POST請求之後,因爲我的所有路由只允許POST。

有沒有辦法解決這個問題,而不改變我的路線以允許GET?

回答

4

爲了強制https,您的RewriteRule需要強制外部重定向。在你的規則的情況下,你迫使301重定向(R=301)。大多數瀏覽器和客戶端被設計爲自動遵循重定向,但他們(不正確)使用GET請求。

因此,當客戶端發送帶有數據的POST請求到http://example.com/route時,您的服務器將301重定向到https://example.com/route,然後客戶端發出一個GET請求,而不會將數據發送到新的URL。正如你所看到的,你不能只是改變你的路由來接受GET請求,因爲在原來的POST請求中發送的數據將被丟棄。

一個辦法是增加一個改寫狀態時不重定向POST請求:

# Force SSL 
RewriteCond %{HTTPS} !=on 
RewriteCond %{REQUEST_METHOD} !=POST 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

然而,這幾乎違背了你試圖實現什麼目的。這整個概念是強制https到處。除了將數據發佈到應用程序之外,在任何地方都強制執行它是愚蠢的。

另一種可能的選擇是將您的301重定向改爲307重定向。即使客戶端不應該更改301/302重定向的請求方法,但大多數客戶端的確會因規格和現有功能不明確而引起爭議。正因爲如此,307增加了具體的想法,如果使用這個狀態碼,請求方法不能改變。但是,307被歸類爲「臨時重定向」,因此它不會被緩存,並可能會影響您的搜索引擎優化。此外,此狀態已添加到HTTP/1.1規範中,因此您可能遇到一些不知道如何處理307的客戶端。

您的最佳選擇可能只是拒絕非安全的POST請求。或者,將它們重定向到錯誤頁面,說明您不接受不安全的POST請求。

RewriteEngine On 

# Forbid non-secure POSTs 
RewriteCond %{HTTPS} !=on 
RewriteCond %{REQUEST_METHOD} =POST 
RewriteRule ^/[F,L] 

# Force SSL 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]