2017-10-10 134 views
1

我正在嘗試在我的.htaccess中編寫一個重寫規則,將除一個域之外的所有流量重定向到https。然後,如果它正在嘗試去的文件不存在,則運行後面的最後一個塊,轉到loader.php,但是如果文件存在,請轉到該文件。htaccess重寫規則,如果文件存在,否則轉到PHP文件

這裏是我到目前爲止迭代之一:

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 
<If "-f %{DOCUMENT_ROOT} . '/'"> 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^.*$ /loader.php [L] 
</If> 
<Else> 
    RewriteEngine On 
    RewriteRule^/404.html [R=404,L] 
</Else> 

我所試圖做的,如果用戶去korlett.orgkorlett.netkorelett.com或內的任何文件,它重定向到https://。但不是http://korle.tt或指向此目錄的其他域(現在未指定),它們將保留HTTP。

然後在此之後,如果該文件不存在,或者如果該URL返回一個404,然後運行這個命令:

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^.*$ /loader.php [L] 
+1

什麼是 tadman

+0

@tadman我這麼認爲,但有人建議我這樣做來檢查文件是否返回404 /未找到。但是,當我嘗試驗證文件時,它說這不是有效的語法(在If)。所以我想這不重要,如果它的作品。有什麼建議麼? – wordSmith

+1

'RewriteCond'指令本身就是一種'if'。其他的東西就在這裏。 – tadman

回答

1

那麼,如果不把它交給loader.php檢查是否還有很長url與該片段/「dir」配對,如果失敗則提供404頁面。

這404響應將需要管理loader.php - 即。在你的PHP腳本中。因爲一旦請求傳遞到loader.php(任何請求沒有映射到文件或目錄),那麼.htaccess已經有效地完成了請求,並且您不能再讓Apache處理404響應。

它應該成爲一個404如果loader.php沒有找到

然而,這的確可以.htaccess進行管理,通過在RewriteRule替代設置的ErrorDocument和消除斜線前綴(無論如何,這可能是有意的,因爲你已經包含了一個RewriteBase指令)。刪除斜槓前綴可防止重寫循環(從反覆重寫到loader.php)。換句話說,而不是這樣的:

RewriteRule ^.*$ /loader.php [L] 

它應該是這樣的:

RewriteRule^loader.php [L] 

正則表達式^具有相同的最終結果如本例^.*$,並簡單地提供了相匹配任何(就像您在HTTP中進行HTTPS重定向一樣)。

這可以防止重寫循環,因爲當重寫爲loader.php(相對路徑,無斜槓前綴)時,重寫引擎會檢測到您正在重寫到相同的URL並阻止進一步的重寫。允許服務Apache 404 ErrorDocument。 (而/loader.php在技術上是一個不同的URL - 就mod_rewrite而言 - 因此重寫將繼續。)

所以,你完全.htaccess文件就變成了:

ErrorDocument 404 /404.html 

RewriteEngine on 
RewriteBase/

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 

的另一種方式,以防止重寫環是包括loader.php特定異常。事實上,這可以與上述一起使用,以便儘早使重寫失敗,而不是等待重寫引擎檢測到不變。例如,將上面的最後一個塊更改爲:

RewriteRule ^loader\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 
+0

''ErrorDocument 404'永遠不會被調用。 – anubhava

+1

@anubhava'ErrorDocument 404'只適用於'loader.php'本身不存在的情況。提供了避免重寫循環的措施,在這種情況下,自定義錯誤文檔確實看起來服務正常。 (一種雙重目的的'.htaccess'文件看起來像這樣 - 雖然這些指令應該可以被刪除,如果'loader.php'不存在,但我想這樣可以避免編輯'.htaccess'文件?) – MrWhite