.htaccess 301重写页面的重定向

.htaccess 301重写页面的重定向,.htaccess,redirect,mod-rewrite,url-rewriting,http-redirect,.htaccess,Redirect,Mod Rewrite,Url Rewriting,Http Redirect,我正在将现有项目从根目录移动到语言文件夹/fr,以便在/en中创建不同的英语项目 这个项目很简单,它包含两个页面(index.php和liste.php)。 第一页接收到一个参数 /index.php?hash=[page-hash] 并在.htaccess中重写为 /[page-hash].html 下面是旧.htaccess的内容: RewriteEngine On ######### Page rewriting ######## RewriteRule ^liste\.html

我正在将现有项目从根目录移动到语言文件夹/fr,以便在/en中创建不同的英语项目

这个项目很简单,它包含两个页面(index.php和liste.php)。 第一页接收到一个参数

/index.php?hash=[page-hash]
并在.htaccess中重写为

/[page-hash].html
下面是旧.htaccess的内容:

RewriteEngine On
#########   Page rewriting  ########
RewriteRule ^liste\.html$           liste.php [QSA,L]
RewriteRule ^(.*)\.html$            index.php?hash=$1 [QSA,L]
RewriteEngine On
######## Redirect from root to /fr #######
RewriteRule ^$                      /fr 
Redirect 301 /liste.html            /fr/liste.html
Redirect 301 /liste.php             /fr/liste.html
#########   Page rewriting  ########
RewriteRule ^fr/liste\.html$        /fr/liste.php [QSA,L]
RewriteRule ^fr/(.*)\.html$         /fr/index.php?hash=$1 [QSA,L]
RewriteRule ^en/list\.html$         /en/list.php [QSA,L]
RewriteRule ^en/(.*)\.html$         /en/index.php?hash=$1 [QSA,L]
我希望被Google索引的旧重写页面(www.domain.com/[page hash].html)被301重定向到www.domain.com/fr/[page hash].html,这样Google仍然可以在新位置找到它们,并被告知它已被移动

这不是重写,而是重定向,我不知道怎么做。我想我必须使用RewriteCond和[R=301],但我不知道如何使用

当然,新页面也必须重写(/fr/index.php?hash=[page hash]到/fr/[page hash].html),并且根目录通常重定向到/fr。因此我已经创建了这个新的.htaccess:

RewriteEngine On
#########   Page rewriting  ########
RewriteRule ^liste\.html$           liste.php [QSA,L]
RewriteRule ^(.*)\.html$            index.php?hash=$1 [QSA,L]
RewriteEngine On
######## Redirect from root to /fr #######
RewriteRule ^$                      /fr 
Redirect 301 /liste.html            /fr/liste.html
Redirect 301 /liste.php             /fr/liste.html
#########   Page rewriting  ########
RewriteRule ^fr/liste\.html$        /fr/liste.php [QSA,L]
RewriteRule ^fr/(.*)\.html$         /fr/index.php?hash=$1 [QSA,L]
RewriteRule ^en/list\.html$         /en/list.php [QSA,L]
RewriteRule ^en/(.*)\.html$         /en/index.php?hash=$1 [QSA,L]

你很接近。当替换包含查询时,您可以压缩这些内容,只需要
QSA
(和
B

RewriteEngine On
######## Redirect from root to /fr #######
RewriteRule ^$ /fr/ [L,R=301]
RewriteRule ^([^/]+)\.(?:html|php)$ /fr/$1.html [L,R=301]
######### Page rewriting ########
RewriteRule ^(fr/liste|en/list)\.html$ $1.php [L]
RewriteRule ^(fr|en)/([^/]+)\.html$ $1/index.php?hash=$2 [L,B,QSA]

以下是完整的答案。订单很重要

RewriteEngine On
#########   Page rewriting  ########
RewriteRule ^fr/liste\.html$        /fr/liste.php [L]
RewriteRule ^fr/(.*)\.html$         /fr/index.php?hash=$1 [L,B,QSA]
RewriteRule ^en/list\.html$         /en/list.php [L]
RewriteRule ^en/(.*)\.html$         /en/index.php?hash=$1 [L,B,QSA]
################ Redirect from root to /fr ################
RewriteRule ^$                      /fr [L,R=301]
RewriteRule ^liste\.html$           /fr/liste.html [L,R=301]
RewriteRule ^(.*)\.html$            /fr/$1.html [L,R=301]

这仍然可以压缩(见沃尔夫的答案)。

我知道了,至少是部分。我使用[R]作为重定向规则,并将其应用于liste.html
RewriteRule^liste\.html$/fr/liste.html[QSA,R,L]
和[L]指令,以便忽略下一个规则。只有这样,我还使用[R]规则重定向其他页面:
RewriteRule^(.*)\.html$/fr/index.php?hash=$1[QSA,R]
Op希望将旧URL重定向到新格式,例如:/path/?q=foo to/foo QSA不是这里的解决方案。谢谢,但它不是解决方案。为了用不同的方式表达,我想依次应用两条规则。首先,这个(重定向):
RewriteRule^(.*)\.html$/fr/index.php?hash=$1[R=301]
,然后这个(重写):
RewriteRule^fr/(.*)\.html$/fr/index.php?hash=$1[QSA,L]
。持久的问题是它必须将此规则应用于所有哈希,而不是/liste.html或/liste.php。前两个规则是重定向,这就是
R=301
所做的。它会像应该的那样,从旧的漂亮URL重定向到新的漂亮URL。你试过了吗?@starkeen你已经从头到脚了。@bolino你错了,你没有在外部重定向中公开你的内部URL结构。你的上一条规则怎么能不无限重定向
RewriteRule^(.*)\.html$/fr/$1.html[L,R=301]
匹配
somehash.html
,但也匹配
en/somehash.html
en/fr/en/fy3/qo4ncg/6R$%^/#CNO/.html
。因为这是最后一条规则,而且因为所有规则都有
[L]
标志?我测试了它,它在所有情况下都有效。不过,我可以将
*
更改为
[^/]+
,使其更具排他性。