.htaccess 重寫規則問題
P粉316890884
P粉316890884 2024-03-20 00:01:01
0
1
322

.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粉316890884
P粉316890884

全部回覆(1)
P粉651109397

此規則的問題在於您正在檢查一個檔案系統路徑(即%{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]

旁白:

此規則(外部重定向)應上述重寫之前。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!