我有这个重写规则,将 foo.com/test (或 foo.com/test/) 转换为 foo.com/test.txt:
RewriteRule ^test/?$ test.txt [NC,L]
它工作得很好,重要的是,永远不会向用户透露“真实”URL 是 foo.com/test.txt。
现在我想做同样的事情,其中“真实”URL 是 foo.com/testdir,其中 testdir 是一个目录:
RewriteRule ^test2/?$ testdir [NC,L]
它执行重写,但向用户显示重写。不是我想要的。
谁能解释一下 Apache 在这里的想法以及最佳解决方案?仅重写 testdir/index.php 对我来说不起作用,因为 index.php 中的代码没有正确的工作目录。 (它的运行方式就好像它是 foo.com/index.php,而 css 文件和其他文件位于 foo.com/testdir/ 中。)也许正确的解决方案是更改 index.php 的内容以引用 testdir/foo。 css 而不仅仅是 foo.css 但我很懒。另外,我宁愿重写规则不必知道它是index.php还是index.html还是what-have-you。
Addendum
感谢第一个答案,我现在看到了问题的本质:如果我希望用户使用 URL me.com/foo 并访问“真实”URL me.com/somedir,那么我必须在两个不需要的 URL 之间进行选择事物:
- URL 明显被重写(用户可以看到 me.com/somedir)。
- somedir 中的内容就像在根目录中一样运行。因此,例如,我必须更改 somedir/index.php 中的所有路径。就像“somedir/style.css”而不是像我直接访问“真实”URL me.com/somedir 时使用的“style.css”
我认为解决这个问题的唯一答案就是忍住并改变这些道路。或者只是将目录“somedir”重命名为“foo”,但由于其他原因我无法这样做。
添加尾部斜杠:
RewriteRule ^test2/?$ testdir/ [NC,L]
http://foo.com/testdir不是该目录的有效 url,Apache 会查找名为 testdir 的文件,并且由于 testdir 实际上是一个目录,Apache 会尝试通过重定向到 testdir/ 来修复它。因此,虽然您的重写有效,但随后的缺失斜杠错误已通过重定向到 testdir/ 来修复。
您可能还需要将基本 href 标签添加到文档的头部,否则相关链接将损坏:
<base href="/">
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)