htaccess 重定向到 url.php

htaccess 重定向到 url.php

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

相关内容