Mod_rewrite不可见:当目标是文件时工作,而不是当它是目录时

时间:2009-11-06 02:24:39

标签: apache url mod-rewrite url-rewriting friendly-url

我有这个重写规则,将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那么我必须选择在两件不受欢迎的事情之间:

  1. URL被明显重写(用户可以看到me.com/somedir)。
  2. somedir中的东西就像在根目录中一样运行。所以我必须更改somedir / index.php中的所有路径。就像“somedir / style.css”而不仅仅是“style.css”,就像我直接使用“真实”网址时那样,me / somedir
  3. 我认为唯一的答案就是吸收并改变这些路径。或者只是将目录“somedir”重命名为“foo”,但由于其他原因我不能这样做。

1 个答案:

答案 0 :(得分:2)

添加尾部斜杠:

RewriteRule ^test2/?$ testdir/ [NC,L]

http://foo.com/testdir不是该目录的有效URL,Apache查找名为testdir的文件,因为testdir实际上是一个目录,Apache试图通过重定向到testdir /来修复它。因此,当您的重写工作时,后续丢失的斜杠错误通过重定向到testdir /.

来修复

您可能还需要在文档的头部添加基本href标记,否则相关链接将会中断:

<base href="/">