.htaccess RewriteCond小问题

时间:2012-09-10 18:40:20

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

感谢@Ω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/.../somepagedomain/sub/.../somepage.php?lang=language的形式重写任何内容。第一个块是domain/language/形式的网址,有或没有结尾/,重定向到index.php

这样可以很好地保留两个小故障:

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

  2. 如果我输入任何以/结尾的url(仅限第二个块,它可以使用索引文件),我的重写就会被破坏,即输出为domain/language/sub/.../somepage/.php有没有办法使用正则表达式排除输入网址中的潜在/

  3. 感谢您的反馈!

1 个答案:

答案 0 :(得分:0)

  

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

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

RewriteCond %1%3.php -f
  

如果我输入任何以/结尾的url(仅使用第二个块,它可以使用索引文件),我的重写就会被破坏,即输出为domain / language / sub /.../ somepage / .php有没有用regexp排除inputed url中的潜在/的方法?

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