我如何使用。htaccess重写重定向根URL到子目录?

试图得到

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]

我做错了什么?

610440 次浏览

试试这个:

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

如果你想要一个外部重定向(这会导致访问浏览器显示重定向的URL),在那里设置R标志:

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

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

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

  • 第二行至少需要一个字符,然后是www.sample.com,它也不匹配(为什么要转义第一个w?)

  • 所包含的规则都没有重定向到您在目标中指定的url(另外,sample被拼错为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]

我搜索了一下,得到了这些结果:

RewriteEngine On
RewriteBase /
重写规则^index.(.*)?$ http://domain.com/subfolder/ [r = 301]
< / p >

将重定向到 访问一个名为index的文件。的东西 您的子文件夹,是否文件

.是否存在

或者试试这个:

< p > RewriteCond % {HTTP_HOST} ^www.sample.com$ [NC]
美元RewriteRule ^ (. *) %{HTTP_HOST}/samlse/$1 [R=301,L]

我没有在.htaccess文件中做很多重定向,所以我不确定这是否会工作。

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

RewriteEngine On
RewriteRule ^$ /store [L]

这是我用来重定向到子目录的。这是无形的,但仍然允许通过匹配现有文件或其他文件的请求。

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。

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

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

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

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

我得到了重定向循环和一些其他的解决方案。

尝试在htaccess中使用下面的行

注意:你可能需要检查default.html的名称是什么

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

RewriteEngine

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

如果你想重写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的文件,但不会向用户显示完整的url。

我不明白你的问题……

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

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/*

我很惊讶居然没有人提到这一点:

RedirectMatch ^/$ /store/
基本上,它重定向根URL,而且只重定向根URL。 答案来自这个链接

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

在我的例子中,当访问www.example.com时,我想重定向到子目录/存储,但不更新URL到www.example.com/store。(所有我想要的是获得该目录的页面代码)。如果这是你的情况,下面的解决方案是完美的。

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

以前,我使用下面的代码,这是工作正确重定向根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]

因此,每当添加另一个子域名/域时,只要子域名的前缀是(如:sub3.domain1.com, sub1.domain3.com等),代码将保持有效。

要设置从根目录到子目录的不可见重定向,可以在/root/中使用下面的RewriteRule。htaccess:

RewriteEngine on


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

上面的规则将从内部重定向浏览器:

  • http://example.com/ < a href = " http://example.com/ " > < / >

  • http://example.com/subfolder < a href = " http://example.com/subfolder " > < / >

  • http://example.com/foo < a href = " http://example.com/foo " > < / >

  • http://example.com/subfolder/foo < a href = " http://example.com/subfolder/foo " > < / >

而浏览器将停留在根文件夹上。

也可以使用重定向来实现这个目的

Redirect 301 / www.example.com/store

Alias .用于映射

Alias / /store

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

具有一定

实现这一目标的两种可能的解决方案是: 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

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

我不会通过指出另一种可能的语法来回答最初的问题(其他答案中有许多),而是通过指出我曾经不得不处理的一些问题,这花了我一段时间来解决:

我做错了什么?

有可能%{HTTP_HOST}没有被正确填充,或者根本没有填充。虽然,我只在共享主机上的一台机器上看到过这种情况,使用一些自定义补丁的apache 2.2,但这仍然是一种可能性。

如果文件在根目录中不存在,这将尝试子目录。需要这个,因为我移动了一个基本的。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]