我在谷歌和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
/Contact
不是目录/Contact
被重写为/subdir/Contact
并在内部重定向/subdir/Contact
是目录,并且没有尾部斜杠,因此它将浏览器重定向到mydomain.com/subdir/Contact/
您可以在.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/