.htaccess子文件夹重写,添加尾部斜杠而不转义'%'

时间:2016-03-15 02:44:11

标签: apache .htaccess mod-rewrite

我正在尝试从其文档根目录的子文件夹中托管我的网站的主域名 - 产生如下目录结构:

/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),因此我无法使用虚拟主机。这种情况在整个网络上发布了解决方案(12等),包括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 的任何子文件夹而不使用尾部斜杠。例如,如果我访问网址

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栏将更改为显示“true”服务器目录结构,而不仅仅是所需的“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]

除了以下网址之外,这是有效的。

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只是让事情变得更糟(“我的脚本”改为“我的%252dscript”,而后者的百分比仍在改变)。

我又难过了......

1 个答案:

答案 0 :(得分:1)

解决方案就像添加“NE”标志一样简单。因此,我的最终工作规则是:

# 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,NE,R=301]

# Internally rewrite all requests to subfolder
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^(.*)$ /www.example.com/$1 [L,NC,QSA]