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

240 .htaccess mod-rewrite redirect

想要得到

www.example.com
Run Code Online (Sandbox Code Playgroud)

直接去

www.example.com/store
Run Code Online (Sandbox Code Playgroud)

我已经尝试了多位代码而没有工作.

我尝试过的:

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]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 267

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

RewriteEngine On
RewriteRule ^$ /store [L]
Run Code Online (Sandbox Code Playgroud)

  • RewriteRule ^ /?$ /index.do [R] (6认同)
  • ^ / $似乎从未匹配,所以我猜^ /?$不是必需的。 (2认同)
  • 如果“/store”是物理子目录,那么您需要在“RewriteRule”_substitution_上附加一个尾部斜杠,否则 mod_dir 将触发 301 外部重定向以附加尾部斜杠,并且“/store/”将暴露给您的用户。另外,如果根目录中有一个“DirectoryIndex”文档(例如“index.html”),正则表达式“^$”将不会“似乎”匹配(“似乎”不会发生任何事情),因为 mod_dir 会发出初始重写之后索引文档的内部子请求。要解决这两个问题,请将其更改为“RewriteRule ^(index\.html)?$ /store/ [L]”。 (2认同)

Dio*_*ung 134

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

RedirectMatch ^/$ /store/
Run Code Online (Sandbox Code Playgroud)

基本上,它重定向根,只重定向根URL.答案来自这个链接

  • 谢谢,这对我已经存在的规则很有用.没有冲突. (3认同)
  • 这对于301重定向:`RedirectMatch 301 ^/$/store /` (3认同)
  • @Andrea对于302临时重定向,它是:RedirectMatch 302 ^ / $ / store / (2认同)

Gum*_*mbo 109

试试这个:

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

如果您想要外部重定向(导致访问浏览器显示重定向的URL),也可以在R那里设置标记:

RewriteRule ^$ /store [L,R=301]
Run Code Online (Sandbox Code Playgroud)

  • 这非常有效.sample.com和www.sample.com都重定向到www.sample.com/store.这就是我想要的.谢谢Gumbo,以及所有回答的人.我学到很多东西阅读你的回答并欣赏反馈. (4认同)

Jag*_*age 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]
Run Code Online (Sandbox Code Playgroud)

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

  • 只做root - 不做子目录 (4认同)
  • 对我来说它给出了"内部服务器错误":/ (3认同)

sta*_*een 25

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

RewriteEngine on

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

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

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


gab*_*ous 20

另一种方法是,如果要重写URL并隐藏原始URL:

RewriteEngine on
RewriteRule ^(.*)$ /store/$1 [L]
Run Code Online (Sandbox Code Playgroud)

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

  • 如果要将查询字符串转移到重写的URL,请将`QSA`(查询字符串追加)添加到`[L]`(`[L,QSA]`). (2认同)

小智 14

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

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

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

  • 这个没有隐藏目录 (2认同)

inf*_*rno 8

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

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

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

http://www.example.com/* -> wwwroot/store/*
Run Code Online (Sandbox Code Playgroud)

如果要重定向到具有域名的子文件夹

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

http://www.example.com/* -> wwwroot/example.com/*
Run Code Online (Sandbox Code Playgroud)


Nir*_* O. 6

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

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


Mah*_*alt 6

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

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

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

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


Abh*_*jar 5

也可以为此目的使用重定向

Redirect 301 / www.example.com/store
Run Code Online (Sandbox Code Playgroud)

或用于映射的别名

Alias / /store
Run Code Online (Sandbox Code Playgroud)

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

提价


小智 5

实现这一目标的可能解决方案有两种:\n1. 在根文件夹中创建一个.htaccess文件,如下所示(只需将 example.com 和 my_dir 替换为相应的值):

\n\n
<IfModule mod_rewrite.c>\nRewriteEngine on\nRewriteCond %{HTTP_HOST} ^(www.)?example.com$\nRewriteCond %{REQUEST_URI} !^/my_dir/\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule ^(.*)$ /my_dir/$1\nRewriteCond %{HTTP_HOST} ^(www.)?example.com$\nRewriteRule ^(/)?$ my_dir/index.php [L] \n</IfModule>\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 使用 RedirectMatch 仅将根 URL \xe2\x80\x9c/\xe2\x80\x9d 重定向到另一个文件夹或 URL,

    \n\n

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

  2. \n
\n