2017-04-05 131 views
0

我想用最少量的重定向來實現以下目標;.htaccess - 刪除www,強制https,刪除php並刪除尾部斜槓

  • 刪除WWW
  • 力HTTPS
  • 刪除PHP擴展
  • 刪除結束斜線

我有什麼事這麼遠,是工作:

RewriteEngine On 

# REMOVE WWW 
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

# FORCE HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

# REMOVE TRAILING SLASH 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [L,R=301] 

# REMOVE PHP EXTENSION 
RewriteRule ^(.+)\.php$ /$1 [NC,L,R=301] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+)/?$ /$1.php [END] 

當前行爲:

http://www.example.com/functions.php -> https://example.com/functions 

(含4個重定向作品)

OR

http://www.example.com/functions/ -> https://example.com/functions 

(含4個重定向作品)

沒有人有任何建議,如何使盡可能少的重定向這項工作?

+0

[獲取.htaccess文件的可能的複製工作中子文件夾](http://stackoverflow.com/questions/27642401/getting-htaccess-file-to-work-in-subfolders) –

回答

1

它不會傷害到只是總是重寫爲https並一步失去www。跟蹤斜槓不變,但通過反轉Cond消除了php-extenstion的一行。

# REMOVE WWW & FORCE HTTPS 
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [OR] 
RewriteCond %{https} off 
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] 

# REMOVE TRAILING SLASH 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [L,R=301] 

# REMOVE PHP EXTENSION if there's no file with this name 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+)\.php$ /$1 [NC,L,R=301] 

如果您還需要處理的請求被作爲不file/.php文件,你應該留你到最後的部分代碼:

RewriteRule ^(.+)\.php$ /$1 [NC,L,R=301] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+)/?$ /$1.php [END] 
+0

第一部分結合了removeral的www和force https作品。雖然刪除extionion的最後部分不起作用。但現在還好些,我只有3個重定向。 – puntable

+0

當要求的文件實際上不存在時,你想刪除'.php',對嗎?你有兩條規則,首先,如果請求的URI以'something.php'結尾,你重寫爲/ something。其次,當一個文件名「.php」被請求並且實際存在時,URI的最後部分被「.php」取得並擴展。所以如果文件不存在,簡短的版本只能刪除'.php'。我的規則確實如此:/ RewriteCond被滿足,如果請求的文件不存在,然後它剝離'.php'。 –

+0

只有第二部分,如果有名爲'%{REQUEST_FILENAME} .php'的文件,添加'.php'不會被處理,因爲它不是您原始問題的一部分,但是如果這也應該完成,那麼你應該留在你的最後一個規則集。相應地編輯我的答案 –