为什么这不能正确地重写网址?

时间:2009-10-24 01:30:26

标签: mod-rewrite

RewriteCond %{REQUEST_URI} !^/?new.php?url
RewriteRule ^/?(.+)\.?(.+)$ new.php?url=$0 [L]

它应该采取任何网址

mysite.com/someurl

并将其转换为

new.php?url=someurl

然而它仍然只是new.php

3 个答案:

答案 0 :(得分:2)

您需要在第一行中转义第二个问号,以便它与文字问号匹配:

RewriteCond %{REQUEST_URI} !^/?new.php\?url

此外,您没有在第二行使用带括号的组。 $0没问题,或者您可能需要$1。如果你使用$0,你可以简化它:

RewriteRule ^.*$ new.php?url=$0 [L]

或者另一方面,如果您因为某个原因而建议修改URL而拆分URL。您没有完全匹配文件名和扩展名。这样一个更复杂的正则表达式可能会让你更好:

RewriteRule ^/?(.*?)(?:\.([^.]*))?$ new.php?path=$1&extension=$2 [L]

说明:

  1. (.*?)匹配目录和文件名。 ?表示非贪婪匹配,因此只要下一部分匹配就停止。括号使其被捕获并存储在$1

  2. (?:\.([^.]*))?与文件扩展名匹配。 ?:转而表示不捕获外部括号集,因此$2中未捕获点。 ([^.]*)匹配扩展名并确保其不包含点。最终?使文件扩展名部分成为可选,只是因为并非所有URL都有文件扩展名。因此,如果有文件扩展名,则只有$2

答案 1 :(得分:0)

第一个反向引用是$1而非$0 AFAIK。如果不这样做,请尝试指定[QSA],但我怀疑是这样。

RewriteCond %{REQUEST_URI} !^/?new.php?url
RewriteRule ^/?(.+)\.?(.+)$ new.php?url=$1 [L]

答案 2 :(得分:0)

第一个后退参考应为$ 1而不是$ 0.

RewriteCond %{REQUEST_URI} !^/?new.php?url
RewriteRule ^/?(.+)\.?(.+)$ new.php?url=$1 [L]

它还取决于您在文件中的其他代码行。如果你有另一个与它冲突的代码,也可能搞乱重写。

相关问题