【发布时间】:2018-08-11 01:48:32
【问题描述】:
我正在用 .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/ (以保持与旧结构更相似的可能性,因此我只需将“page”重定向到“newpage”而不弄乱文件夹...),但是当我尝试在没有 ita/ 或 eng/ 的情况下设置规则时,我最终会陷入冲突或循环。 这就是为什么我正在寻找一个正则表达式来表达(但不是 ita 或 eng)。
【问题讨论】:
-
看看
RewriteCond。这将使您的代码集更易于阅读。 -
此外,您似乎只缺少第一条规则中的
/。