【发布时间】:2016-06-30 07:55:43
【问题描述】:
我正在尝试从其文档根目录的子文件夹托管我网站的主域 - 生成如下目录结构:
/public_html/www.main-domain.com/ <--I need to do this with htaccess
/public_html/sub1.main-domain.com/ <--For subdomains I can just set the doc root w/ cpanel
/public_html/sub2.main-domain.com/
它是共享主机(HostGator),所以我没有能力使用虚拟主机。这种情况在网络上发布了解决方案(1、2 等),包括 htaccess 规则,如:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?main\-domain.com$ [NC]
RewriteCond %{REQUEST_URI} !^/www.main\-domain.com/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /www.main-domain.com/$1
RewriteCond %{HTTP_HOST} ^(www.)?main\-domain.com$ [NC]
RewriteRule ^(/)?$ www.main-domain.com/index.php [L]
上述规则确实有效,除非我尝试访问 www.main-domain.com 的任何子文件夹没有尾部斜杠。例如,如果我访问 url
http://www.main-domain.com/images/ (with trailing slash)
它工作正常。但是,如果我访问
http://www.main-domain.com/images (no trailing slash)
然后浏览器 URL 栏会更改以显示实际的完整服务器路径:
http://www.main-domain.com/www.main-domain.com/images/
请注意,在这两种情况下,内容都正确提供 - 唯一的问题是(除非明确输入尾部斜杠)URL 栏将更改以显示“真实”服务器目录结构,而不仅仅是所需的“www.main-domain.com/images”。
这实际上与here 是同一个问题,但是公认的答案是使用虚拟主机——这在我的情况下是不可能的。同一个人也在ServerFault 上发帖,但已关闭回复。一个有希望的答案建议在最终 index.php 规则之前添加以下内容:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} !/$
RewriteRule ^(.*) $1/
不幸的是,这对我不起作用。如果有人可以提出一组规则来完成“子文件夹中的主域”, 和 不会受到“无尾随斜杠”问题的影响,我将不胜感激。
--编辑--
我主要通过以下规则来解决这个问题:
# Externally redirect to add trailing slash to extensionless URLs if missing
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(([^/]+/)*[^./]+)$ http://www.example.com/$1/ [L,R=301]
# Internally rewrite all requests to subfolder
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^(.*)$ /www.example.com/$1 [L,NC,QSA]
这有效,但 URL 如下:
http://www.example.com/my-script?xdm_e=https%3A%2F%2Fjk.test
重定向到:
http://www.example.com/my-script/?xdm_e=https%253A%252F%252Fjk.test
请注意,除了添加尾部斜杠(根据需要)外,百分比符号也已扩展为“%25”。我认为这可能与“B”标志有关,但将其添加到 RewriteRule 只会让事情变得更糟(“my-script”被更改为“my%252dscript”,后面的百分比仍然被改变)。
我又被难住了……
【问题讨论】:
标签: apache .htaccess mod-rewrite