我正在为我的项目使用漂亮的url,它运行得很好。
http://testurl.com/user/12345
我正在使用.htaccess进行重定向。
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} s/user.php?id=([0-9]+)s [NC]
RewriteRule ^ user/%1? [R=301,L]
RewriteCond %{THE_REQUEST} s/user.php?id=([0-9]+)&name=([^&s]+)s [NC]
RewriteRule ^ user/%1/%2? [R=301,L]
RewriteRule ^user/([0-9]+)/?$ user.php?id=$1 [L]
RewriteRule ^user/([0-9]+)/([^/]+)$ user.php?id=$1&name=$2 [L]
今天,我发现如果我像这样更改浏览器中的链接http://testurl.com/user.php
,那么页面也在加载。如果有人直接试图访问,我想显示错误消息(Alert)
最好的方法是在没有id
查询字符串的user.php
中添加错误或重定向。
但您也可以添加(在RewriteBase /
之后):
RewriteCond %{THE_REQUEST} s/user.phps [NC]
RewriteRule ^ - [F]
您还可以通过代码重组来解决问题。我在我的一个项目中做到了这一点,而且效果很好。
1.当你创建一个漂亮的URL时,将相应的文件移到另一个目录中
因此,在本例中,URL example.com/user.php?id=123
在外部可见。现在,您需要一个漂亮的URL,例如example.com/user/123
。
在文件级别上,在您使用之前
- user.php
我建议你把它移到另一个目录,在那里所有的脚本都可以通过漂亮的URL访问:
- rewrites/
|- user.php
2.从外部为旧URL创建到新URL的重定向
和你上面做的一样。
RewriteCond %{THE_REQUEST} s/user.php?id=([0-9]+)s [NC]
RewriteRule ^ user/%1? [R=301,L]
RewriteCond %{THE_REQUEST} s/user.php?id=([0-9]+)&name=([^&s]+)s [NC]
RewriteRule ^ user/%1/%2? [R=301,L]
3.在内部重写新的、漂亮的URL以移动脚本
和上面一样,只是添加了目录名rewrites
。
RewriteRule ^user/([0-9]+)/?$ rewrites/user.php?id=$1 [L]
RewriteRule ^user/([0-9]+)/([^/]+)$ rewrites/user.php?id=$1&name=$2 [L]
4.example.com/user.php
现在以404失败
因为/user.php
在文件系统中已经不存在了,所以如果在没有params的情况下调用,它会自动失败,并显示404。
5.福利
这种方法听起来可能是免费的额外工作,但在我看来,这些好处使它更有价值:
- 您不需要额外的
.htaccess
规则来处理错误 - 你得到了更好的代码组织
- 您可以通过漂亮的URL更好地了解已经可以访问的内容