【问题标题】:How can I use .htaccess rewrite to redirect root URL to subdirectory?如何使用 .htaccess rewrite 将根 URL 重定向到子目录?
【发布时间】:2010-11-02 16:30:07
【问题描述】:

试图得到

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]

我做错了什么?

【问题讨论】:

    标签: .htaccess mod-rewrite redirect


    【解决方案1】:

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

    RewriteEngine On
    RewriteRule ^$ /store [L]
    

    【讨论】:

    • 如果/store 是物理子目录,那么您需要在RewriteRule substitution 上附加一个斜杠,否则 mod_dir 将触发 301 外部重定向来附加斜杠和/store/ 将暴露给您的用户。此外,如果您在根目录中有 DirectoryIndex 文档(例如 index.html),则正则表达式 ^$ 不会“出现”匹配(没有“出现”发生),因为 mod_dir 将发出内部子请求索引文档初始重写之后。要解决这两个问题,请将其更改为 RewriteRule ^(index\.html)?$ /store/ [L]
    • 我应该在哪里添加这个?
    【解决方案2】:

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

    RedirectMatch ^/$ /store/
    

    基本上,它会重定向根并且仅重定向根 URL。 答案源自this link

    【讨论】:

    • 这很简单,也是迄今为止最好的答案
    • @iamnabink 这取决于您是想要 internal rewrite(如问题中所述并由较早的答案回答)还是 302-temporary external redirect (如此处所述)。它还取决于您是否有现有的 mod_rewrite 指令,正如 OP 所明确的那样。因此,在 question 的上下文中,它不是“最佳答案”。 YMMV。
    • 我应该在哪里添加这个?
    • 如果您无权访问服务器配置文件,请将此行添加到 Web 应用根目录下的 .htaccess 文件中(例如 /var/www/html_docs/.htaccess)。否则你可以修改服务器配置,查看更多httpd.apache.org/docs/2.4/mod/mod_alias.html#redirectmatch
    • 它适用于我的网络。而且非常简单:D
    【解决方案3】:

    试试这个:

    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/store。这正是我想要的。谢谢Gumbo,以及所有回答的人。阅读您的回复并感谢您的反馈,我学到了很多东西。
    • 我很好奇,这会将www.example.com 显示为重定向后的URI 吗?如果不是,如何改变它?
    • ♦ - 为什么你的解决方案会比下面的 Sander 更好?我注意到你的最后一行是相同的,但如果这就是所有需要的,为什么包括RewriteCond 和第一行RewriteRule
    • 如果使用此代码,您可以在浏览器中输入 exmple.com/../aboveSubDir 吗?
    • @GamErix 这将被浏览器或服务器解析为/aboveSubDir
    【解决方案4】:

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

    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。

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

      • 如果您需要用户不可见的重定向,此答案效果很好。
      【解决方案6】:

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

      【讨论】:

      • 如果您希望查询字符串结转到重写的 url,请将 QSA(查询字符串追加)添加到 [L][L, QSA])。
      • @chaiguy 感谢您的提示,但在我的服务器上它可以在没有 QSA 的情况下工作(但我同意附加 QSA 可能更好)。也许是因为我的 apache 服务器的一些特殊配置?
      • 这个方法对我来说,example.com 透明地显示来自 example.com/store 的内容,但 example.com/test 重定向到 example.com/store/test,显示 url
      • @devios1 在此示例中您不需要 QSA 标志,因为 substitution 字符串中没有查询字符串。当 substitution 中没有查询字符串时,默认通过请求中的原始查询字符串。
      • 此示例将导致重写循环(500 错误响应),除非您在 /store 子目录中还有另一个 .htaccess 文件,该文件也包含 mod_rewrite 指令(因为 mod_rewrite 指令不是由默认,从而防止重写循环)。
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        以上大部分解决方案都是正确的,但都缺少重定向的透明性。

        在我的例子中,当我访问 www.example.com 时,我想被重定向到子目录 /store 但没有更新到 www.example 的 URL .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 即可。
        • 我解释得不是很好。我拥有example.comotherpage.com 域。当我访问 example.com 时,我希望显示来自 otherpage.com/subfolder 的内容,而不更新 URL
        • 好吧,我上面的回答并没有做到这一点。尝试发布一个新问题。
        【解决方案9】:

        我不明白你的问题...

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

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

        【讨论】:

        • 我喜欢您的代码([^\.]+\.[^\.]+)$ 将域保留为子文件夹名称。
        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

          以前我使用以下代码可以正常工作,将我的每个域/子域的根 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】:

            也可以为此目的使用 Redirect

            Redirect 301 / www.example.com/store
            

            Alias 用于映射

            Alias / /store
            

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

            参考

            【讨论】:

            • 这里不能使用Redirect,会导致重定向循环。 (您可以使用RedirectMatch,如其他答案中所述。)此外,Alias 指令将需要在 file-path (第二个参数)上加上斜杠,即。 Alias / /store/,否则对 /foo 的请求将映射到 /storefoo 而不是 /store/foo
            【解决方案13】:

            实现此目的的可能解决方案有两种: 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,

              重定向匹配 ^/$ http://www.example.com/my_dir

            【讨论】:

              【解决方案14】:

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

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

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

              • 所有包含的规则都不会重定向到您在目标中指定的网址(另外,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]
              

              【讨论】:

                【解决方案15】:

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

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

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

                或者试试这个:

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

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

                【讨论】:

                  【解决方案16】:

                  尝试在 htaccess 中使用以下行

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

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

                  RewriteEngine

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

                  【讨论】:

                    【解决方案17】:

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

                    【讨论】:

                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

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

                        我做错了什么?

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

                        【讨论】:

                          猜你喜欢
                          • 2014-06-08
                          • 1970-01-01
                          • 2023-04-10
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-04-04
                          • 2017-06-26
                          相关资源
                          最近更新 更多