这更像是对此问题的跟进问题: .htaccess - how to force "www." in a generic way?
我有这个规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
我想将它们与答案中提供的内容合并:
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
这些是正确的结果(正确的顺序和规则)吗?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
到目前为止,一切都按预期工作,但我所有的测试都是在时间网址中完成的,而不是在实际的域名中完成。
谢谢!
答案 0 :(得分:1)
这些规则应该做你想要的,但我会稍微调整一下。由于您的工作原理,这只是基于我的偏好的建议。 :)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php/$1 [L]
</IfModule>
我发现当所有非规则的Rewrite选项首先出现时,它更容易阅读。我还想添加空白行,这样就可以更容易地看到一组规则的结束和下一个规则的开始。
此规则是不必要的:RewriteRule ^index\.php$ - [L]
因为下一条规则只会影响对未映射到真实文件的URI的请求。因为index.php存在于文件系统上,所以它不会触发下一个规则。
对于index.php规则,添加/ $ 1会使请求在$ _SERVER ['PATH_INFO']中可用,这可能会有所帮助,具体取决于代码的编写方式。这绝对不是必需的,但是像WordPress或CodeIgniter这样的应用程序建议这种方法很常见,所以我认为值得一提。