htaccess 重定向到 url.php

htaccess 重定向到 url.php

我想要以下 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/usernameGET 使用者名稱時,回顯為

username.php

我已經嘗試了一切,但無法得到解決方案
感謝任何幫助

答案1

當我輸入www.example.com/usernameGET 使用者名稱時,回顯為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,})$

相關內容