我有这个重写规则,将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或者你有什么。
感谢第一个答案,我现在看到了问题的实质:如果我希望用户使用URL me.com/foo并访问“真实”网址me.com/somedir那么我必须选择在两件不受欢迎的事情之间:
我认为唯一的答案就是吸收并改变这些路径。或者只是将目录“somedir”重命名为“foo”,但由于其他原因我不能这样做。
答案 0 :(得分:2)
添加尾部斜杠:
RewriteRule ^test2/?$ testdir/ [NC,L]
http://foo.com/testdir不是该目录的有效URL,Apache查找名为testdir的文件,因为testdir实际上是一个目录,Apache试图通过重定向到testdir /来修复它。因此,当您的重写工作时,后续丢失的斜杠错误通过重定向到testdir /.
来修复您可能还需要在文档的头部添加基本href标记,否则相关链接将会中断:
<base href="/">