.htaccess
重寫規則有問題。將使用者電子郵件中的 URL 傳遞到瀏覽器,其中包含用於密碼重設的令牌。
目前 .htaccess
規則:
Options FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.DOMAIN\.com [NC] RewriteRule ^(.*)$ https://DOMIAN.com/$1 [L,R=301] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L] RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC] RewriteRule ^(.*)\.php$ $1 [R=301,L]
當使用者嘗試去
example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6
在偵錯中產生這些錯誤
example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6.php.php.php.php.php.php.php.php.php.php
所以我按照下面的註解更新 .htaccess,如下所示:
Options FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.EXAMPLE\.com [NC] RewriteRule ^(.*)$ https://EXAMPLE.com/$1 [L,R=301] RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC] RewriteRule ^(.*)\.php$ $1 [R=301,L] # Rewrite extensionless ".php" URLs RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (. ) $1.php [L] # Rewrite "/<file>/<code>" to "/<file>.php/<code>" RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^([^/] )/([a-f0-9])$ $1.php/$2 [L]
我收到以下錯誤:
AH00128:檔案不存在:/var/www/html/htdocs/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6
P粉6511093972024-03-20 21:37:57
此規則的問題在於您正在檢查一個檔案系統路徑(即%{REQUEST_FILENAME}\.php
)並重寫到另一個檔案系統路徑($1.php
# )。這些不一定指同一件事。對於對/activate/foo
的請求,其中activate
不是檔案系統目錄,則REQUEST_FILENAME
的格式為/var/www/html/htdocs /activate
(因此檔案檢查成功,因為/var/www/html/ htdocs/activate.php
存在),但它將請求重寫為activate/foo.php
(使用$1
反向引用) - 該請求不存在。它將重複執行此操作,每次附加 .php
(直到達到內部重寫限制;預設 10)。
Aside#1: 在檢查 request .php
是否對應到檔案之前,無需檢查請求是否已對應到目錄且未對應到檔案。當只需要一項時,這是 3 次(昂貴的)檔案系統檢查。
Aside#2: 您也不需要反斜線轉義TestString (第一個參數)中的文字點,因為這是一個「普通」字串,不是正規表示式。
此規則需要修正,以便您測試最終要重寫的相同檔案路徑。例如:
# Rewrite extensionless ".php" URLs RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (. ) $1.php [L]
然後,您需要一條附加規則將請求/activate/
重寫為
/activate.php/
(將
/
作為路徑資訊傳遞給您的腳本)。如果這是一次性的,這可能是「硬編碼」的。例如:
# Rewrite "/activate/" to "/activate.php/"
RewriteRule ^(activate)/([a-f0-9] )$ $1.php/$2 [L]
(我假設 是一個十六進位序列,在您的範例中似乎就是這種情況。)
或者,如果您有類似的請求,請使其更通用。例如。 /<檔案>/
到
/<檔案>.php/
。例如:
# Rewrite "// " to "/
.php/ " RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^([^/] )/([a-f0-9] )$ $1.php/$2 [L]
旁白:
此規則(外部重定向)應在上述重寫之前。