用于在 url 重写中排除文件夹的正则表达式



我正在用.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/(以使事情更类似于旧结构,所以我只需要将"页面"重定向到"newpage"而不会弄乱文件夹...(,但是当我尝试设置没有 ita/或 eng/的规则时,我最终陷入冲突或循环。 这就是为什么我正在寻找一个正则表达式来表达(一些东西,但不是ita或eng(。

您可以使用此规则,该规则将所有情况组合在一起

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(将匹配

最新更新