我制作了一個 .htaccess 檔案來將 /username 重寫為 /profile.php?=username
這是我的 htaccess 檔案
Options All -Indexes
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-] )$ /profile.php?username=$1 [QSA,L]
問題是相同級別的其他檔案被跳過,除非我添加了它們的.php擴展名,這很糟糕。如果該檔案存在,我可以防止 /username 重寫并且還進行另一次重寫以使 URL 沒有檔案擴展名嗎?
uj5u.com熱心網友回復:
您可以按給定順序保留這兩條規則:
Options All -Indexes -MultiViews
RewriteEngine On
## To internally rewrite /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(. ?)/?$ $1.php [L]
## for user profile
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w-] )/?$ profile.php?username=$1 [QSA,L]
為此,關閉-MultiViewsApache 的(內容協商服務)很重要。
uj5u.com熱心網友回復:
@MrWhite 現在什么都沒有,我只想在檔案存在時停止重寫
這些規則將協同作業。如果您在重寫請求之前檢查目標.php檔案是否存在(在您的無擴展 URL 上) - 正如您應該那樣 - 那么您不需要對將請求重寫為.profile.php
例如:
# Append ".php" if request file without extension and target file exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.] [^/])$ $1.php [L]
# Rewrite user profiles (directory check is optional)
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-] )$ profile.php?username=$1 [QSA,L]
我假設您的 URL 不包含點(這自然避免了對以檔案擴展名結尾的請求進行例外處理)。正則運算式^([^.] [^/])$匹配不包含點且不以斜杠結尾的 URL(即,目錄以斜杠結尾)。
檔案系統檢查相對昂貴,因此最好保持在最低限度(或盡可能避免)。在附加“.php”擴展名的規則中,在檢查附加時請求是否映射到檔案之前,不需要檢查請求是否映射到目錄,這些檢查是相互包含的。(但如果一個目錄確實存在,那么該檔案將無法訪問 - 捕獲 22。).php
同樣,無需檢查用戶組態檔 URL 是否未映射到檔案,除非您還有沒有檔案擴展名的檔案(如果您這樣做,這不太可能并且最好避免)。
甚至對用戶組態檔 URL 的目錄檢查也是有爭議的。僅當您需要能夠直接訪問根目錄之外的子目錄時才需要這樣做。
使用這組有限的規則,是否啟用 MutliViews 并不重要。(盡管最佳實踐規定應在此處禁用 MultiViews,以避免將來發生沖突。)啟用 MultiViews 的效果將意味著.php繞過附加檔案擴展名的第一條規則(不是必需的)。但是啟用 MultiViews 基本上可以在所有內容上啟用無擴展 URL 。
考慮重構您的用戶組態檔 URL
但是,您的用戶組態檔 URL 結構存在一個基本“問題” - 即它們與實際檔案請求“沖突”。實際的檔案請求自然會優先,但這意味著您不能擁有恰好與根目錄中的檔案匹配的用戶名- 因為用戶組態檔將無法訪問。創建/更新用戶帳戶時需要強制執行此檢查。
最好通過創建“唯一”URL 來避免這種歧義,并允許所有用戶名(也可以匹配根檔案)。例如。/user/<username>. 這也完全避免了必須執行目錄檢查。例如:
# Rewrite user profiles (directory check is not required)
RewriteRule ^user/([a-zA-Z0-9_-] )$ profile.php?username=$1 [QSA,L]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473504.html
