.htaccess重写以将根URL重定向到子目录

时间:2009-06-13 09:28:02

标签: .htaccess mod-rewrite redirect

试图获得

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]

我做错了什么?

19 个答案:

答案 0 :(得分:261)

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

RewriteEngine On
RewriteRule ^$ /store [L]

答案 1 :(得分:127)

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

RedirectMatch ^/$ /store/

基本上,它重定向根,只重定向根URL。 答案来自this link

答案 2 :(得分:107)

试试这个:

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

如果您想要外部重定向(导致访问浏览器显示重定向的网址),请同时设置R标记:

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

答案 3 :(得分:76)

以下是我用来重定向到子目录的内容。这样做是不可见的,并且仍允许通过匹配现有文件或其他任何内容的请求。

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。

答案 4 :(得分:22)

要设置从root到子文件夹的不可见重定向,可以在/root/.htaccess中使用以下RewriteRule:

RewriteEngine on

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

上述规则将在内部重定向浏览器:

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

答案 5 :(得分:20)

如果您想重写网址并隐藏原始网址,则另一种选择:

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

有了这个,如果你输入http://www.example.com/product.php?id=4,它会透明地在http://www.example.com/store/product.php?id=4打开文件,但不会向用户显示完整的网址。

答案 6 :(得分:13)

这似乎是最简单的解决方案:

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

我正在使用其他一些解决方案获得重定向循环。

答案 7 :(得分:8)

我不明白你的问题......

如果您想将每个请求重定向到子文件夹:

RewriteRule ^(.*)$ shop/$1 [L,QSA]

http://www.example.com/* -> wwwroot/store/*

如果要重定向到具有域名

的子文件夹
RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$
RewriteRule ^(.*)$ %1/$1 [L,QSA]

http://www.example.com/* -> wwwroot/example.com/*

答案 8 :(得分:6)

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

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

答案 9 :(得分:6)

上述大多数解决方案都是正确的,但它们都缺少重定向的透明度。

就我而言,访问 www.example.com 时,我希望重定向到 / store 子目录,但不会将网址更新为 www.example的.com /商店即可。 (我想要的只是获取该目录的页面代码)。如果是这种情况,下面的解决方案可以完美运行。

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

答案 10 :(得分:4)

为此目的,也可以使用 Redirect

Redirect 301 / www.example.com/store

Alias 进行制图

Alias / /store

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

Refrences

答案 11 :(得分:4)

以前我使用以下代码可以正常工作,将我的每个域/子域的根URL重定向到它们的通信子目录,这些子目录完全像它自己命名为子/域,如下所示:

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]

因此,只要子域名的前缀为 sub (例如:sub3.domain1.com,sub1.domain3.com等),只要添加了其他子域/域,代码就会保留有效的。

答案 12 :(得分:3)

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

  • 第一行在严格来自sample.com的主机上匹配,因此www.sample.com不匹配。

  • 第二行至少需要一个字符,其次是www.sample.com也不匹配(为什么你逃脱了第一个w?)

  • 所包含的规则都没有重定向到您在目标中指定的网址(此外,示例拼写错误,但不相关)。

供参考,以下是您目前拥有的代码:

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]

答案 13 :(得分:3)

有点谷歌搜索,给我这些结果:

  

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

     

这将重定向任何尝试   访问名为index.something的文件   你的子文件夹,无论是文件   存在与否。

或试试这个:

  

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

我在.htaccess文件中没有做太多重定向,所以我不确定这是否有效。

答案 14 :(得分:1)

尝试在htaccess中使用以下行

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

default.html是默认情况下在根文件夹中加载的文件。

RewriteEngine

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

答案 15 :(得分:1)

实现这一目标的可能解决方案有两种方法: 1.在根目录下创建一个.htaccess文件(只需将example.com和my_dir替换为相应的值):

<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“/”重定向到另一个文件夹或URL,

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

答案 16 :(得分:0)

您只需将此代码添加到.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>

答案 17 :(得分:0)

我会回答原始问题,而不是指出另一种可能的语法(其他答案中有很多)但是通过指出我曾经不得不处理的事情,我花了一些时间才弄明白:

What am I doing wrong?

%{HTTP_HOST}可能未正确填充,或者根本没有填充。虽然,我只看到只在共享主机上的一台机器上发生,但有一些自定义修补的apache 2.2,但它仍然是可能的。

答案 18 :(得分:0)

如果根目录中不存在该文件,则会尝试使用子目录。需要这个,因为我移动了一个基本的.html网站,希望在根级别运行并将其推送到子目录。仅当所有文件都是平的时才有效(在子目录中没有.htaccess技巧)。对于像css和js文件这样的链接内容很有用。

# Internal Redirect to subdir if file is found there.
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/subdir/%{REQUEST_URI} -s
RewriteRule ^(.*)$ /subdir/$1 [L]