问题
我有a piece of code from another Q&A这是在网址中强制使用www的通用解决方案:
# Force www.
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301]
我对逻辑的理解:
如果HTTP_HOST仅定义为"(无句点字符串)。(无句点字符串)",即。 example.com,然后捕获余数并使用附加到HTTP_POST和捕获字符串头部的www重建URL。
我已将此代码放在我的网络文档根目录中的.htaccess文件中。在该文件夹中有许多子目录,每个子目录都包含自己的.htaccess文件,用于处理重定向和清除automatically managed by a CMS的URL。这些子目录中的所有条目都倾向于遵循以下模式:
RewriteRule ^$ /reason/displayers/generate_page.php?site_id=11111&page_id=222222
RewriteRule ^page$ /subdirectory/page/ [R=permanent]
RewriteRule ^page/$ /reason/displayers/generate_page.php?site_id=111111&page_id=333333
我遇到的第一个问题是解决方案中的RewriteRule
仅触发网站的根页而不是任何子目录或页面:
Looking at another Q&A,用户建议将RewriteOptions inherit
添加到.htaccess子目录中。在单个测试目录中使用我的初始RewriteRule
执行此操作会产生以下结果:
页面内容确实出现,但URL肯定不太理想。该Q& A的OP留下了评论,指出他们需要使用%{REQUEST_URI}
而不是尝试捕获和重用它。使用RewriteRule
,我得到:
关闭,但我当然不希望参数出现在SEO那里。
问题
有没有办法将这种规则应用于所有子目录和页面而无需进入并将RewriteOptions inherit
行添加到每个子目录.htaccess?鉴于这些是CMS每次创建站点时动态创建的,手动管理包含该行并非理想。
假设,是否有任何解决方案可以解决"坏"鉴于CMS自动将哪些内容放入子目录,我尝试利用RewriteOptions inherit
收到的网址?
替代
最后一个可能超出了本网站的范围,但鉴于它的相关性,我将其包含在以前不可行的情况下,或者如果以下情况更可取:
是否可以使用VirtualHosts条目处理此类重定向?就我而言,我可以告诉他们," example.com"和" www.example.com"解析为相同的IP和文档根目录。如果它们可以分开,www.example.com可以保持原样,而example.com设置为去其他地方,允许明确的重定向发生,也许?
<VirtualHost 111.11.11.111:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/
...
</VirtualHost>
答案 0 :(得分:1)
是的确,要将规则应用于所有子目录,请在<VirtualHost..>
部分插入此规则:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]