.htaccess重写将根URLredirect到子目录

试图得到

www.example.com 

直接去

 www.example.com/store 

我已经尝试了多位代码,没有工作。

我试过了:

 Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^example.com$ RewriteRule (.*) http://www.example.com/$1 [R=301,L] RewriteCond %{HTTP_HOST} ^(.+)\www.example\.com$ RewriteRule ^/(.*)$ /samle/%1/$1 [L] 

我究竟做错了什么?

您可以使用重写规则,使用^ $来表示根目录,并将其重写到/ store目录,如下所示:

 RewriteEngine On RewriteRule ^$ /store [L] 

尝试这个:

 RewriteEngine on RewriteCond %{HTTP_HOST} ^example\.com$ RewriteRule (.*) http://www.example.com/$1 [R=301,L] RewriteRule ^$ store [L] 

如果您需要外部redirect(导致访问的浏览器显示redirect的URL),请在此处设置R标志:

 RewriteRule ^$ /store [L,R=301] 

我很惊讶,没有人提到这个:

 RedirectMatch ^/$ /store/ 

基本上,它redirect根和只有根URL。 答案来自这个链接

这是我用来redirect到一个子目录。 这做了不可见的,仍然允许通过匹配现有的文件或其他任何请求。

 RewriteEngine on RewriteCond %{HTTP_HOST} ^(www.)?site.com$ RewriteCond %{REQUEST_URI} !^/subdir/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /subdir/$1 RewriteCond %{HTTP_HOST} ^(www.)?site.com$ RewriteRule ^(/)?$ subdir/index.php [L] 

用您的值更改site.com和subdir。

如果要重写URL并隐藏原始url,可以使用另一种方法:

 RewriteEngine on RewriteRule ^(.*)$ /store/$1 [L] 

有了这个,例如,如果您键入http://www.example.com/product.php?id=4 ,它将透明地打开http://www.example.com/store/product.php?id=4的文件http://www.example.com/store/product.php?id=4但没有向用户显示完整的url。

要设置从根目录到子目录的不可见redirect,可以在/root/.htaccess中使用以下RewriteRule:

 RewriteEngine on RewriteCond %{REQUEST_URI} !^/subfolder RewriteRule ^(.*)$ /subfolder/$1 [NC,L] 

上面的规则将内部redirect浏览器:

而浏览器将保留在根文件夹中。

这似乎是最简单的解决scheme:

 RewriteEngine on RewriteCond %{REQUEST_URI} ^/$ RewriteRule (.*) http://www.example.com/store [R=301,L] 

我得到了一些其他解决scheme的redirect循环。

我不明白你的问题

如果要将每个请求redirect到子文件夹,请执行以下操作:

 RewriteRule ^(.*)$ shop/$1 [L,QSA] http://www.example.com/* -> wwwroot/store/* 

如果你想redirect到具有域名的子文件夹

 RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$ RewriteRule ^(.*)$ %1/$1 [L,QSA] http://www.example.com/* -> wwwroot/example.com/* 

我发现为了避免循环redirect,将redirect的范围限制在根目录是很重要的。 我会用:

 RewriteEngine on RewriteCond %{REQUEST_URI} ^/$ RewriteRule (.*) http://www.example.com/store [R=301,L] 

上面的大部分解决scheme都是正确的,但是都缺lessredirect的透明度。

就我而言,访问http://www.example.com时,;我想将其redirect到子目录/商店,但不更新URL到http://www.example.com/store 。 (我想要的是从该目录获得页面代码)。 如果这是你的情况,下面的解决scheme完美的作品。

 RewriteEngine on RewriteCond %{HTTP_HOST} example\.com [NC] RewriteCond %{REQUEST_URI} ^/$ RewriteRule ^(.*)$ /store/$1 [L] 

来源: http : //wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory

以前我使用下面的代码正确地工作,将每个域/子域的根URLredirect到它们的子对象的子目录,这些子目录完全像它自己的子/域一样命名如下:

 RewriteCond %{HTTP_HOST} ^sub1.domain1.com RewriteCond %{REQUEST_URI} !subs/sub1.domain1.com/ RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA] RewriteCond %{HTTP_HOST} ^sub2.domain1.com RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/ RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA] RewriteCond %{HTTP_HOST} ^sub1.domain2.com RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/ RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA] RewriteCond %{HTTP_HOST} ^sub2.domain2.com RewriteCond %{REQUEST_URI} !subs/sub2.domain2.com/ RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA] 

但是,当我想添加其他子或域,那么它将需要添加在上面的代码。 将其简化为像通配符(*)那样工作应该更方便一些,如下所示:

 RewriteCond %{HTTP_HOST} ^sub RewriteCond %{REQUEST_URI} !/subs/ RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA] 

所以,只要子域名的前缀是域(比如:sub3.domain1.com,sub1.domain3.com等),只要添加了其他子域/域,代码将保持有效。

也可以使用redirect来达到这个目的

 Redirect 301 / www.example.com/store 

或映射的别名

 Alias / /store 

编辑: mod_alias只适用于httpd.conf。

Refrences

我认为你发布的代码的主要问题是:

  • 第一行匹配以严格sample.com开头的主机,所以www.sample.com不匹配。

  • 第二行至less要有一个字符,然后是www.sample.com,这个字符也是不匹配的(你为什么要逃出第一个字符?)

  • 所包含的规则都不会redirect到您在目标中指定的url(另外,样本被拼写为samle,但这是无关紧要的)。

作为参考,这里是你现在的代码:

 Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^sample.com$ RewriteRule (.*) http://www.sample.com/$1 [R=301,L] RewriteCond %{HTTP_HOST} ^(.+)\www.sample\.com$ RewriteRule ^/(.*)$ /samle/%1/$1 [L] 

有一点Google,给我这些结果:

RewriteEngine On
RewriteBase /
RewriteRule ^ index。(。*)?$ http://domain.com/subfolder/ [r = 301]

这将redirect任何尝试访问名为index.something文件到您的子文件夹,无论文件是否存在。

或者试试这个:

RewriteCond%{HTTP_HOST}!^ http://www.sample.com $ [NC]
RewriteRule ^(。*)$%{HTTP_HOST} / samlse / $ 1 [R = 301,L]

我没有在.htaccess文件中做很多redirect,所以我不知道这是否会工作。

尝试在htaccess中使用下面的行

注意:您可能需要检查default.html的名称

default.html是根文件夹中默认加载的文件。

RewriteEngine

Redirect /default.html http://example.com/store/

实现这个目标的可能的解决scheme有两种方法:1.在根文件夹下创build一个.htaccess文件(只需将example.com和my_dirreplace为相应的值):

 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^(www.)?example.com$ RewriteCond %{REQUEST_URI} !^/my_dir/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /my_dir/$1 RewriteCond %{HTTP_HOST} ^(www.)?example.com$ RewriteRule ^(/)?$ my_dir/index.php [L] </IfModule> 
  1. 使用RedirectMatch将根URL“/”redirect到另一个文件夹或URL,

    RedirectMatch ^ / $ http://www.example.com/my_dir

您只需将这些代码添加到.htaccess文件中

 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /folder/index.php [L] </IfModule>