【问题标题】:.htaccess subfolder rewrite, add trailing slash without escaping '%'.htaccess 子文件夹重写,添加斜杠而不转义 '%'
【发布时间】: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),所以我没有能力使用虚拟主机。这种情况在网络上发布了解决方案(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 的任何子文件夹没有尾部斜杠。例如,如果我访问 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


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2014-06-22
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      相关资源
      最近更新 更多