.htaccess 301重写页面的重定向
我正在将现有项目从根目录移动到语言文件夹/fr,以便在/en中创建不同的英语项目 这个项目很简单,它包含两个页面(index.php和liste.php)。 第一页接收到一个参数.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
/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]
标志?我测试了它,它在所有情况下都有效。不过,我可以将*
更改为[^/]+
,使其更具排他性。