使用正则表达式排除网址重写中的文件夹

时间:2018-08-10 13:02:02

标签: .htaccess url-rewriting

我正在用.htaccess重写url。 我需要编写一个正则表达式以在重写规则中排除某些文件夹。我提出了一些类似的问题,但仍然无法解决。 我想从www.mywebsite.it/page.php、www.mywebsite.it/eng/page.php和www.mywebsite.it/ita/page.php

删除.php

这些是我的规则:

RewriteRule ^/(?!ita|eng)([A-Za-z0-9\-\+]+).php$ /$1 [R=302,NC]
RewriteRule ita/([A-Za-z0-9\-\+]+).php$ ita/$1 [R=302,NC]
RewriteRule eng/([^x]+).php$ eng/$1 [R=302,NC]

第二个和第三个正在工作,但第一个没有。 我在做什么错了?

我尝试了很多想法,但是当规则生效时,就会与其他规则发生冲突。

更新: 这是我的规则:

RewriteRule ^(.*).it$ $1/index.php?lang=it [NC,L]
RewriteRule ^(.*)eng/$ $1/index.php?lang=en [NC,L]

RewriteRule ^ita/([A-Za-z0-9\-\+]+)$ $1.php?lang=it [NC,L]
RewriteRule ^eng/([A-Za-z0-9\-\+]+)$ $1.php?lang=en [NC,L]

该部分有效,我做了它的seo优化。 现在,我必须重定向网站的旧网址(我更改了网站的结构而没有更改域)。

结构之前为:www.mywebsite.it/page.html(意大利语)www.mywebsite.it/eng/page.html(英语)

,新结构为:www.mywebsite.it/ita/newpage.php(意大利语)和www.mywebsite.it/eng/newpage.php(英语)

所以我尝试了:

#html to php
RewriteRule (.*).html$ /$1.php [R=302]

Redirect 302 /page.php http://www.mywebsite.it/ita/newpage.php   
Redirect 302 /eng/page.php http://www.mywebsite.it/eng/newpage.php

#remove php
RewriteRule ita/([A-Za-z0-9\-\+]+).php$ ita/$1 [R=302,NC]
RewriteRule eng/([^x]+).php$ eng/$1 [R=302,NC]

但是当我访问eng / page.html时,我被重定向到eng / ita / newpage

然后,我认为我可以更改新结构并删除意大利语的ita /文件夹(以使类似于possibile的内容保持旧结构,因此,我只需要将“页面”重定向到“新页面”而不用弄乱了文件夹...),但是当我尝试设置没有ita /或eng /的规则时,我最终陷入冲突或循环中。 这就是为什么我要寻找一个正则表达式要说的东西(不是ita或eng)。

1 个答案:

答案 0 :(得分:0)

您可以使用此规则,将所有情况结合起来

RewriteRule ^(ita/|eng/|)([^/]+)\.php$ /$1$2 [R=302,L,NC]

您的第一个规则不起作用,因为从未匹配。确实,在htaccess上下文中,没有匹配的前导斜线。还有一个冲突/匹配问题,因为您的前瞻性?!和文件名部分为负。

更新

更新后,这里是相应的代码

# (1) *.html -> *.php
RewriteRule ^(.+)\.html$ /$1.php [R=302,L,NC]

# (2) /page.php to /ita/newpage.php and /eng/page.php to /eng/newpage.php
RewriteRule ^page\.php$ /ita/newpage.php [R=302,L,NC]
RewriteRule ^eng/page\.php$ /eng/newpage.php [R=302,L,NC]

# (3) /ita/page.php or /ita/page (same for eng) and /page.php to /page
RewriteRule ^(ita/|eng/|)([^/]+)\.php$ /$1$2 [R=302,L,NC]

# (4) rewrite to /file.php?lang=xx
RewriteRule ^ita/(.+)$ /$1.php?lang=it [NC,L]
RewriteRule ^eng/(.+)$ /$1.php?lang=en [L,NC]

注意:(3)将无用(/ita/除外),因为(2)将会匹配