我想要以下 urlwww.example.com/userprofile.php?username=username
下面www.example.com/username
是我的 htaccess 文件
Options All -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]
RewriteRule ^(.*)$ userprofile.php?username=$1 [QSA]
當我輸入www.example.com/username
GET 使用者名稱時,回顯為
username.php
我已經嘗試了一切,但無法得到解決方案
感謝任何幫助
答案1
當我輸入
www.example.com/username
GET 使用者名稱時,回顯為username.php
因為您在文件的前面進行了重寫:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
重寫/username
(任何不映射到現有文件的請求)/username.php
前將其重寫為userprofile.php?username=username.php
.這就是為什麼您會看到帶有後綴的 GET 參數值.php
。
同樣,以下兩個RewriteRule
指令目前沒有執行任何操作,因為較早的規則正在捕獲請求。
RewriteRule ^([^\.]+)$ $1index [NC,L] RewriteRule ^([^\.]+)$ $1login [NC,L]
如果我們修改前面的重寫以附加副檔名,這些只會與「使用者名稱」重寫發生衝突.php
。而且,這兩個規則相互衝突 - 您將相同的 URL 與兩個規則配對 - 第一個規則總是獲勝。 (一個輸入具有兩個不同的輸出在任何情況下都是不可能的。)事實上,這可能會產生重寫循環。
這兩個指令應該被刪除。
為了避免.php
被附加到username
,您可以檢查該.php
文件是否存在前重寫它。例如:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
不過,我也會考慮更改您的 URL 結構,以便您可以輕鬆定位專門說明使用者名稱的 URL。例如:
www.example.com/u/username
然後你的指令可以寫得不那麼含糊(並且不會那麼依賴文件中指令的順序):
RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]
另外,捕捉使用者名稱的正規表示式要更具體。此模式.*
捕獲任何事物。例如,如果使用者名稱只能包含字母 a..z,則使用正規表示式,如^u/([a-z]+)$
.如果使用者名稱必須包含 4 個或更多字符,則:^u/([a-z]{4,})$
。