【问题标题】:Regular expression to exclude folders in url rewriting在 url 重写中排除文件夹的正则表达式
【发布时间】: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。这将使您的代码集更易于阅读。
  • 此外,您似乎只缺少第一条规则中的/

标签: .htaccess url-rewriting


【解决方案1】:

你可以使用这个规则,它结合了所有的情况

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

【讨论】:

  • 感谢您的回答!我按照您的建议进行了尝试,但是又发生了另一个冲突,因为在使用查询重写为实际 url 之后我有另一组 url...而且我更喜欢将三个规则分开,因为文件夹 ita/ 对应于查询 ?lang =it 和 eng/ 是 ?lang=en。我需要在第一条规则中说些什么(除了 ita 或 eng 之外的所有内容),以便对这三种情况进行不同的处理。希望我自己解释!我根本不是专家
  • 请用您的其他规则更新您的问题,我会处理的
  • 好的,我做到了!我的问题实际上和我问的问题有点不同!我认为这可能是找到解决方案的好方法。
  • 有点奇怪。考虑到您的解释,我尝试更新我的答案,但我不确定我是否掌握了这个意大利面条网址方案的所有内容
  • 非常感谢!它的工作! 3 号导致问题,因为它使用查询字符串删除了实际 url 中的 .php。但是,如果我将 ita/ 和 eng/ 分开,那很好(如果 2 号有效,我不需要将 page.php 重写到页面中)。所以我有 3 号:^ita/(.+).php$ ita/$1 [R=302,NC] 和 ^eng/(.+).php$ ita/$1 [R=302,NC]。我取消了规则编号 1,2 和 3 中的 L 标志,因为它导致 mod_rewrite 停止处理规则集,我是对的吗?再次感谢!!!
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多