我在谷歌和StackOverflow上摸索了一下,试图找出我的问题,尝试了无数种解决方案,但没有什么能完全起作用。

我希望将服务器上主域的Web根目录移到子目录中。我目前拥有用于我的Web根的服务器路径的内容:

/home/user/public_html/MyWebFilesHere

我想要拥有的是:
/home/user/public_html/subdir/MyWebfilesHere

当我浏览到mydomain.com时,尽管没有明显的区别(即“subdir”在重定向后不可见)。

不幸的是,我只能使用.htaccess文件执行此操作,因为我位于共享主机上,并且无法访问Apache配置文件等。 :(

我目前在public_html的.htaccess中拥有的内容是:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteRule ^(.*)$ /subdir/$1 [L]

这样可以成功地将所有查询重定向到子目录,但是确实存在一个奇怪的问题。如果我去
mydomain.com/Contact/

它的工作原理很好,将查询重定向到路径/subdir/Contact/,但地址栏不留任何内容。如果我去
mydomain.com/Contact

(请注意,缺少结尾的“/”),地址栏中显示的是
mydomain.com/subdir/Contact/

这不是我想要的,因为显示了“subdir”。

有关实际站点上的工作示例,请尝试浏览到
colincwilliams.com/Contact/

和....相比
colincwilliams.com/Contact

你们对如何在无斜杠和无斜杠的情况下保持静音工作有任何想法吗?

最佳答案

发生这种情况的原因可能是mod_dir(如果对目录的请求缺少尾部斜杠,该模块会自动将浏览器重定向到带有尾部的斜杠。请参见DirectorySlash directive in mod_dir

发生了什么事:

  • 您的请求:mydomain.com/Contact
  • mod_dir与之无关,因为/Contact不是目录
  • /Contact被重写为/subdir/Contact并在内部重定向
  • mod_dir看到/subdir/Contact是目录,并且没有尾部斜杠,因此它将浏览器重定向到mydomain.com/subdir/Contact/
  • 因此,现在,浏览器的位置栏中包含/subdir/。

  • 您可以在.htaccess中添加DirectorySlash off,以关闭重定向的mod_dir。但是,如果您希望目录末尾带有斜杠,则可以为其添加单独的条件。根据您已有的资源,我们可以将其扩展为:
    RewriteEngine on
    
    # Has a trailing slash, don't append one when rewriting
    RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$
    RewriteCond %{REQUEST_URI} !^/subdir/
    RewriteCond %{THE_REQUEST} ./\ HTTP/1\.[01]$ [OR]
    # OR if it's a file that ends with one of these extensions
    RewriteCond %{REQUEST_URI} \.(php|html?|jpg|gif|css)$
    RewriteRule ^(.*)$ /subdir/$1 [L]
    
    # Missing trailing slash, append one
    RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$
    RewriteCond %{REQUEST_URI} !^/subdir/
    RewriteCond %{THE_REQUEST} [^/]\ HTTP/1\.[01]$
    # But only if it's not a file that ends with one of these extensions
    RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif|css)$
    RewriteRule ^(.*)$ /subdir/$1/ [L]
    

    注意:我将!^/mydomain/更改为!^/subdir/,认为这是一个错字,因为没有它,mod_rewrite会在内部无限期循环(foo->/subdir/foo->/subdir/subdir/foo->/subdir/subdir/subdir/foo等)。如果我错了,可以改回来。

    编辑:查看我对\.(php|html?|jpg|gif|css)的RewriteCond匹配项。这些是通过文件扩展名而未添加结尾斜杠的文件扩展名。您可以添加/删除以适合您的需求。

    关于apache - htaccess静默重定向到子目录: Subdirectory showing when no trailing '/' ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8046222/

    10-09 05:57