htaccess无声重定向到子目录:子目录显示何时没有尾随'/'

Col*_*ams 5 apache .htaccess mod-rewrite

我在谷歌和StackOverflow周围挖掘高低,试图找出我的问题,尝试无数的解决方案,但没有任何完全有效.

我想将服务器上主域的Web根目录移动到子目录.我目前用于Web根目录的服务器路径:

/home/user/public_html/MyWebFilesHere
Run Code Online (Sandbox Code Playgroud)

我想要的是:

/home/user/public_html/subdir/MyWebfilesHere
Run Code Online (Sandbox Code Playgroud)

当我浏览到mydomain.com时,应该没有明显的区别(即重定向后"subdir"不可见).

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

我目前在public_html中的.htaccess中拥有的是:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteRule ^(.*)$ /subdir/$1 [L]
Run Code Online (Sandbox Code Playgroud)

这成功地将所有查询重定向到子目录,但是这是一个非常奇怪的问题.如果我去

mydomain.com/Contact/
Run Code Online (Sandbox Code Playgroud)

它工作得很好,将查询重定向到路径/ subdir/Contact /但只留下地址栏.如果我去

mydomain.com/Contact
Run Code Online (Sandbox Code Playgroud)

(注意缺少尾随'/'),地址栏中显示的是

mydomain.com/subdir/Contact/
Run Code Online (Sandbox Code Playgroud)

因为"subdir"显示,这不是我想要的.

有关我实际网站上的工作示例,请尝试浏览

colincwilliams.com/Contact/
Run Code Online (Sandbox Code Playgroud)

和....相比

colincwilliams.com/Contact
Run Code Online (Sandbox Code Playgroud)

你们有没有关于如何使用和不使用尾部斜线进行静默工作的想法?

Jon*_*Lin 7

这可能发生,因为mod_dir(如果目录的请求缺少一个尾部斜杠同样的事情,可自动将浏览器重定向模块尾部斜杠.见在mod_dir DirectorySlash指令

发生的事情是:

  1. 你要求: mydomain.com/Contact
  2. mod_dir不会触及此,因为/Contact它不是目录
  3. /Contact被重写/subdir/Contact并在内部重定向
  4. mod_dir看到这/subdir/Contact是一个目录并且缺少尾部斜杠,因此它将浏览器重定向mydomain.com/subdir/Contact/
  5. 现在,您的浏览器的位置栏中包含/ subdir /.

您可以添加DirectorySlash off.htaccess来关闭重定向的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]
Run Code Online (Sandbox Code Playgroud)

注:我换!^/mydomain/!^/subdir/,想通这是一个错字,因为没有它,mod_rewrite的将环内无限(FOO - > /子目录/富- > /子目录/子目录/富- > /子目录/子目录/子目录/富等).如果我弄错了,你可以改回来.

编辑:看看我添加的RewriteCond匹配\.(php|html?|jpg|gif|css).这些是在不添加尾部斜杠的情况下传递的文件扩展名.您可以添加/删除以满足您的需求.