【问题标题】:.htaccess RewriteCond small issue.htaccess RewriteCond 小问题
【发布时间】:2012-09-11 03:47:40
【问题描述】:

感谢@Ωmega,我几乎完全解决了我以前的问题(详情在这里.htaccess regular expression issue)并得出了这个解决方案:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)(/|)$ [NC]
RewriteCond %1%3index.php -f
RewriteRule ^(.*/|)(en|de|fr)(/|)$ index.php?lang=$2 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)(/.*|)$ [NC]
#RewriteCond $1$3.php -f
RewriteRule ^(.*/|)(en|de|fr)(/.*|)$ $1$3.php?lang=$2 [NC,QSA,L]

基本上,这些行会将domain/language/sub/.../somepage 形式的任何内容重写为domain/sub/.../somepage.php?lang=language。第一个块是domain/language/ 形式的url,有或没有结尾/ 被重定向到index.php

这工作得很好,但仍然存在两个小故障:

  1. 无论如何,第二块中的第 3 行(我#commented)就是不匹配。奇怪的是它确实在第 4 行工作,即我的页面实际上显示正常。这是否意味着-f 参数在这里是错误的?

  2. 1234563 987654331@ 在带有正则表达式的输入 url 中?

感谢您的反馈!

【问题讨论】:

    标签: regex .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    无论如何,第二块中的第三行(我#commented)就是不匹配。奇怪的是它确实在第 4 行工作,即我的页面实际上显示正常。这是否意味着这里的-f参数是错误的?

    您使用了错误的反向引用。你想要 %1 和 %3:

    RewriteCond %1%3.php -f
    

    如果我输入任何以 / 结尾的 url(仅第二个块,它确实适用于索引文件),我的重写被破坏,即输出为 domain/language/sub/.../somepage/.php 有没有使用正则表达式在输入的 url 中排除潜在 / 的方法?

    是的,您可以尝试将RewriteCondRewriteRule 中的正则表达式从^(.*/|)(en|de|fr)(/.*|)$ 更改为^(.*/|)(en|de|fr)(/.*?)/?$

    【讨论】:

    • 这个^(.*/|)(en|de|fr)(/.*?)/?$ 根本不匹配。这个^(.*/|)(en|de|fr)(/.*|)/?$ 最终匹配,但问题是一样的,结尾/ 被第三个() 组吃掉并最终输出somepage/.php。现在对于 RewriteCond,它不起作用 :( 但真的不知道为什么。即使我的页面显示正确,然后我取消注释 #RewriteCond %1%3.php -f,url 也不匹配了。奇怪。
    • 括号内的? 使其成为非贪婪搜索,因此最后一个/? 不会被.* 分组吞噬
    • 好吧,这行得通,但你忘了提到只在RewriteRule 行上进行修改。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多