1

可能重复:
.htaccess 重写 URL 显示不正确?

我试图用 htaccess 在我的 url 中隐藏动态 php,现在我完全是使用 htaccess 的初学者,从我到目前为止所学到的知识中,我设法做到了这一点:

Options +FollowSymLinks
RewriteEngine on

RewriteRule ^home/$ http://www.something.com/index.php?p=home [NC,L]
RewriteRule ^home$ http://www.something.com/index.php?p=home [NC,L]

现在发生的事情是当我写的时候让我们说:

www.something.com/home

或者

www.something.com/home/

我重定向到http://www.something.com/index.php?p=home但我想要发生的也是被视为 www.something.com/home 的 url,而不是显示完整路径用户,有人可以告诉我我做错了什么吗?

提前致谢 :))

4

2 回答 2

6

如果您在重写规则中写入完整的 url - apache 将执行重定向(因为不可能透明地将请求重写到不同的服务器 - 即使完整的 url 对应于当前服务器)。

最简单的解决方案

对于问题中的示例,您可以简单地从重写规则中删除域名:

RewriteRule ^home/?$ /index.php?p=home [QSA,NC,L]

这将匹配 url/home/home/并将它们重写为/index.php?p=home

处理任何网址

一个更灵活的想法是重写所有 url,例如:

RewriteRule ^(.*)$ index.php?p=$1 [QSA,L]

它将重写当前 url 的任何内容作为 get 参数“p”。

一个完整的示例,它不会重写对真实文件(/css/foo.css 或任何其他资产)的请求:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?p=$1 [QSA,L]

QSA 标志的用途

两个示例中使用的标志将任何现有的 get 参数与正在重写qsa的新 get arg 合并。p所以例如

 /foo?bar=zum

变成

/index.php?p=/foo&bar=zum
于 2013-01-04T00:21:31.367 回答
3

发生这种情况是因为您输入了完整的网址。尝试这个:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^home/$ index.php?p=home [NC,L]
RewriteRule ^home$ index.php?p=home [NC,L]
于 2013-01-04T00:22:31.763 回答