我正在使用.htaccess
代码来更改url(在非www url中添加"www."),但我的问题是在url中输入/子文件夹时,.htaccess
重定向无法正常工作。
示例
我输入这个网址:mydomain.com/demo/它重定向到:www.mydomain.com(不带/demo
)
知道吗?
这是我的.htaccess
代码:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
也许是这样?
#强制www#如果你有子域,你可以将它们添加到#使用"|"(OR)regex运算符的列表重写结束%{HTTP_HOST}^(www|local|admin)[NC]重写规则^(.*)$http://www.yourdomainhere.com/1美元[L,R=301]
我已经更改了代码并将其放在根路径中,它运行良好:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^mydomain.com$ [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]
</IfModule>
.htaccess文件应该放在/demo文件夹中,但当我把它的位置移到/demo文件夹时,我发现它不能很好地重定向。
即:http://mydomain.com/demo/?querystring重定向=>http://www.mydomain.com/?querystring
问题是url中的"demo/"被删除了。
你知道吗?
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
尝试此代码添加www
:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^mydomain.com$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
您的问题是,如果.htaccess文件被放在www根文件夹的子文件夹中,那么在将其传递给重写规则之前,子文件夹的名称将从路径中删除:
"在
.htaccess
文件中使用重写引擎时,对于"重写规则"模式匹配,每个目录前缀(对于特定目录始终相同)将自动删除,并自动添加到任何相对前缀之后(不以斜杠或协议名开头)替换遇到规则集的末尾。有关将添加回相对替换的前缀的更多信息,请参阅RewriteBase指令。"
因此,重写规则中的^(.*)$
正则表达式(假定匹配整个路径并将其保存在$1
中)实际上只匹配路径的demo/
前缀之后的部分。
要解决此问题,您有两个选项:
-
a) 将.htaccess文件(或者至少这个特定的重写规则)移动到www根文件夹。如果出于某种原因,仍然希望它只匹配"demo"文件夹下的路径,请将
^(.*)$
regex替换为例如^(demo(/.*)?)$
。 -
b) 将文件夹名称添加回您自己,使您的重写规则看起来像这样:
重写引擎打开重写结束%{HTTP_HOST}^www。[NC]重写规则^(.*)$http://www.%{HTTP_HOST}/演示/$1[R=301,L,NS]
(我还添加了NS
标志,因为您可能希望它用于像这样的"修饰性"外部重写。)