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


246

试图得到

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]

我究竟做错了什么?

Answers:


275

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

RewriteEngine On
RewriteRule ^$ /store [L]

6
RewriteRule ^ /?$ /index.do [R]
barclay'12

2
^ / $似乎从未匹配,所以我猜^ /?$不是必需的。
NateS 2014年

然后可以显示完整网址并继续处理规则吗?就我而言,我重写了一些网址,以便它们很漂亮。这样可以保留网址example.com-我想要example.com/store,然后继续进行其他重写。
gin93r 2014年

对我也很好。
Jitesh Sojitra,

1
就在最近,我花了很多时间调试为什么在Ubuntu Apache 2.4.7中的站点上不起作用。重写调试表明该规则已被执行并生成内​​部重定向。然后它似乎只是将其停放并寻找索引页。事实证明,如果启用了mod_dir且dir中有索引页候选,则它将覆盖mod_rewrite,除非您进行设置:DirectoryCheckHandler On
Gerrit

142

我很惊讶没有人提到这件事:

RedirectMatch ^/$ /store/

基本上,它会重定向根目录,并且仅重定向根URL。答案源自此链接


3
谢谢,这对我来说已经很有效了。没有冲突。
科学家2014年

1
这是完美的作品。此外,它涵盖了http和https。
Sayem Shafayet 2015年

3
301重定向:RedirectMatch 301 ^/$ /store/
Andrea

是的,使用重写更简单。谢谢!
Orden

2
@Andrea对于302临时重定向:RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

108

试试这个:

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]

4
效果很好。sample.com和www.sample.com都重定向到www.sample.com/store。那正是我想要的。谢谢Gumbo,以及所有回答的人。通过阅读您的回复,我学到了很多东西,并感谢您的反馈。

1
我很好奇,www.example.com重定向后会显示为URI吗?如果没有,将如何更改呢?
stefmikhail,2011年

1
♦-为什么您的解决方案会比下面的Sander更好?我注意到您的最后一行是相同的,但是如果仅此而已,为什么还要包含RewriteCond和第一行RewriteRule
stefmikhail,2011年

如果使用此代码,是否可以在浏览器中输入exmple.com/../aboveSubDir?

@GamErix这将由/aboveSubDir浏览器或服务器解决。
Gumbo,2012年

79

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

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。


可以正常工作!大!
kachar

主页是“隐身” ...但是一旦单击链接,子目录名称就会显示在地址栏中...是否可以防止子目录名称显示?
dsdsdsdsd 2013年

4
仅做根目录
php-b-grader

3
对我来说,它给出了“内部服务器错误”:/
Pithikos

1
非常感谢,您不知道我一直在找多久了。
2014年

26

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

RewriteEngine on

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

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

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


1
这应该是可接受的答案... RewriteRule(如其他答案所建议)会引起无限重定向,因为/ subfolder被重定向到/ subfolder / subfolder,依此类推... RewriteCond%{REQUEST_URI}!^ / subfolder确保如果URL已被重定向,就不会再进行了
patrick '18

21

如果您要重写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。


2
如果要将查询字符串结转到重写的url,请在()上添加QSA(附加查询字符串)。[L][L, QSA]
devios1

@chaiguy谢谢您的提示,但是在我的服务器上,它没有QSA即可工作(但我同意最好附加QSA)。也许是因为我的apache服务器有一些特殊的配置?
令人惊讶的2014年

1
对于我来说,example.com的这种方法透明地显示了来自example.com/store的内容,但是example.com/test重定向至example.com/store/test,并显示了网址
Geoffrey Hale

14

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

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

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


2
这一个不隐藏目录
PHP-B-年级

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

我喜欢您的代码([^\.]+\.[^\.]+)$将域保留为子文件夹名称。
Chetabahana '16

6

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

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

6

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

就我而言,当访问www.example.com时,我希望重定向到子目录/ store,但不将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


如果我需要www.example.com重定向到www.othersite.com/store而不更新URL,该怎么办?我尝试过但无法适应您的代码
步骤

我试图到最后一行改变RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L],但它更新URL

您所需要做的就是替换examplestore
Mahmoud Zalt 2015年

我的解释不太好。我拥有example.comotherpage.com域名。当我访问时,example.com我希望在otherpage.com/subfolder不更新URL的情况下显示内容
步骤

好吧,我上面的答案没有做到这一点。尝试发布新问题。
Mahmoud Zalt 2015年


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等),该代码就会保持有效。


3

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

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

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

  • 所包含的规则均不会重定向到您在目标中指定的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]

2

稍作谷歌搜索,可以得到以下结果:


RewriteBase On RewriteBase /
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文件中没有做太多重定向,所以我不确定这是否行得通。


2

有两种方法可以解决此问题: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


1

尝试在htaccess中使用以下行

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

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

RewriteEngine

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


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>

0

我将不通过指出其他可能的语法(在其他答案中有很多)来回答原始问题,而是通过指出我曾经不得不处理的某些事情,这花了我一段时间来弄清楚:

What am I doing wrong?

%{HTTP_HOST}可能没有正确填充或根本没有填充。虽然,我只看到这种情况仅发生在共享主机上的一台计算机上,并且使用了一些自定义的修补的Apache 2.2,但这还是有可能的。


0

如果根目录中不存在该文件,则将尝试使用subdir。当我移动一个基本的.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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.