htaccess 短网址

dur*_*ian 1 mod-rewrite

可能重复:
.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]
Run Code Online (Sandbox Code Playgroud)

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

www.something.com/home

或者

www.something.com/home/

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

提前致谢 :))

AD7*_*six 5

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

最简单的解决方案

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

RewriteRule ^home/?$ /index.php?p=home [QSA,NC,L]
Run Code Online (Sandbox Code Playgroud)

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

处理任何网址

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

RewriteRule ^(.*)$ index.php?p=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)

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

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

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

QSA标志的目的

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

 /foo?bar=zum
Run Code Online (Sandbox Code Playgroud)

变成

/index.php?p=/foo&bar=zum
Run Code Online (Sandbox Code Playgroud)