看不见的mod_rewrite并不总是看不见的!? (“www”和“没有子域名”)

时间:2012-01-31 16:52:23

标签: apache mod-rewrite

我的网站位于使用cPanel 11的主机上。

不幸的是,它将“www.e-motiv.net”和“e-motiv.net”重定向到public_html。 我想要的。 public_html / www和public_html /这对最终用户来说是不可见的。

我认为最好的方法是通过mod_rewrite,所以我做了以下几点。

文件空间如下(来自public_html /):

  • /。htaccess的
  • 的index.php
  • /www/index.html
  • /www/test/index.html

我想要这个(第二部分看不见!):

  1. e-motiv.net - >的index.php
  2. www.e-motiv.net - > /www/index.php
  3. www.e-motiv.net/test - > /www/test/index.php
  4. 我以为会这样做:

    RewriteCond %{HTTP_HOST} ^www.e-motiv.net$
    RewriteCond %{REQUEST_URI} !/www
    RewriteRule ^(.*)$ /www/$1  [NC,L]
    

    1和2工作,但虽然3给出了正确的文件,但它改变了地址!? (所以不可见) 所以,在地址栏中你会得到:www.e-motiv.net/test - > www.e-motiv.net/www/test/ 咦??

    如果mod_rewrite不是最佳解决方案,请告诉我们!

1 个答案:

答案 0 :(得分:1)

这是因为mod_dir。 mod_dir将尾部斜线添加到映射到目录的URL。 mod_dir不知道用mod_rewrite创建的这些“虚拟URL”。

因此,要么使用

禁用此行为
DirectorySlash Off

但是,这将向www.example.com/folder提出请求,导致找不到404。你可以用一些重写来解决这个问题。所以完整的解决方案就像:

DirectorySlash Off
#www dir only
RewriteCond %{DOCUMENT_ROOT}/$0 -d
RewriteRule ^www/(.+[^/])$ /$1/ [R,L]
#other dirs
RewriteCond %{DOCUMENT_ROOT}/$0 -d
RewriteRule ^(.+[^/])$ /$1/ [R,L]