Dot-Htaccess

Apache:將所有 .html 和 .php 請求重定向到文件夾 + WordPress

  • July 19, 2018

重新啟動後,我有一堆指向帶有文件副檔名.php.html文件副檔名的 URL 的死反向連結。最好使用.htaccessmod_rewrite 模組批量重定向它們。

請求的重定向.html工作正常,但是,我無法讓.phpURL 的重定向工作。請注意,我使用 WordPress,因此必須有一個/wp-admin/文件夾的豁免。

到目前為止,這是我想出的,但它不適用於.php

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Redirect http requests to https
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^(.*)$ https://www.example.com/$1 [L]

# Redirect html
RewriteCond %{REQUEST_URI} \.html
RewriteRule ^(.*)\.html$ /$1 [L] 

# Redirect php NOT WORKING
RewriteCond %{REQUEST_URI} !^/wp-admin/
RewriteCond %{REQUEST_URI} \.php
RewriteRule ^(.*)\.php$ /$1 [L] 

# Lines below come from WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

你能看出我哪裡錯了嗎?還是我完全迷路了?

# Redirect html
RewriteCond %{REQUEST_URI} \.html
RewriteRule ^(.*)\.html$ /$1 [L]

這不是您似乎建議的“重定向”,如“外部 3xx 重定向”。如果您看到“重定向”,那麼要麼是其他東西正在這樣做,要麼您看到的是記憶體響應。上面的指令是內部重寫- 瀏覽器地址欄中的 URL 不會改變(這對 SEO不利)。

在這種情況下,該RewriteCond指令也是多餘的……它只是意味著您正在檢查.html請求的 URL兩次

如果您想.html通過重定向刪除擴展,那麼您只需要以下內容:

RewriteRule ^(.*)\.html$ /$1 [R,L]

但是,.php要從 URL 中刪除副檔名,您還需要避免重定向index.php(WordPress 前端控制器會重寫),或者只確保您檢查的是初始請求,而不是重寫的請求。例如:

# Redirect php (avoiding "/wp-admin/" and "/index.php")
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteCond %{REQUEST_URI} !^/wp-admin/
RewriteRule ^(.*)\.php$ /$1 [R,L]

為了確保您只測試初始請求而不是重寫請求,您可以使用如下條件

RewriteCond %{ENV:REDIRECT_STATUS} ^$

這只是檢查REDIRECT_STATUS 環境變數是否為空 - 它在初始請求中。在第一次成功重寫後,它被設置為“200”(如 200 OK HTTP 狀態)。

如果這是一個永久重定向,請更改為R,但只有在您確認它工作正常後才可以。R=301

您還應該避免將您自己的自定義指令添加到# BEGIN WordPress塊中,因為這些指令可能會被 WordPress 本身覆蓋。相反,這些指令應與您的 HTTP 到 HTTPS 重定向一起寫塊之前(這# BEGIN WordPress實際上也不是重定向*-需要*在.R``RewriteRule

引用自:https://serverfault.com/questions/922701