我想要以下网址,www.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,})$
。