如何在通用正则表达式规则的例外中避免循环?

时间:2014-04-27 02:35:15

标签: apache mod-rewrite

需要使用标志吗? 的RewriteCond mod_rewrite 已启用并且正在推动,我的问题是如何表达我的需求:规则有一般规则和一些例外,例外不起作用,解决方案必须避免循环。

我的/var/www之前使用 mod_rewrite ,正在处理常用文件夹,例如/var/www/wiki/var/www/foo/var/www/bar(每个文件夹都带有索引) 。我需要保留这种行为。

现在,使用 mod_rewrite ,我使用/var/www/index.php重定向一些与^([a-z0-9]+)匹配的特殊字符串,例如http://myDomain/foo123或{{1} }。但它也匹配“wiki”和“foo”,需要异常处理


我的http://myDomain/wiikii

/var/www/.htaccess

所以像 RewriteEngine on RewriteRule ^/?(foo|bar)([0-9]+) index.php?$1=$2 RewriteRule ^/?([a-z0-9]+) index.php?foobar=$1 这样的内容会重定向到http://myDomain/wiki,但我需要它而不需要重定向,需要Apache转到index.php?foobar=wiki

PS:我尝试了一些变体,并对/wiki进行了一些更改(在内部使用重定向),但需要优雅且安全的Apache Rewrite解决方案,避免循环

2 个答案:

答案 0 :(得分:1)

如果您不想对wiki文件夹(和其他人)进行任何重定向,则可以添加条件

RewriteEngine on

# If requested url is an existing file or folder, don't touch it
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule . - [L]

# If we reach here, this means it's not a file or folder, we can rewrite...
RewriteRule   ^(foo|bar)([0-9]+)$      index.php?$1=$2 [L]
RewriteRule   ^([a-z0-9]+)$            index.php?foobar=$1 [L]

此外,如果您不希望将其应用于所有文件夹/文件,则可以使用某种例外

RewriteEngine on

# If requested url is a folder/file in exception list, don't touch it
RewriteCond %{REQUEST_URI} ^/(foo|bar|example_file\.html|wiki)$
RewriteRule . - [L]

# If we reach here, this means it's not a file or folder in exception list, we can rewrite...
RewriteRule   ^(foo|bar)([0-9]+)$      index.php?$1=$2 [L]
RewriteRule   ^([a-z0-9]+)$            index.php?foobar=$1 [L]

答案 1 :(得分:1)

通常条件是要去的方法,检查REQUEST_URI。

 RewriteCond %{REQUEST_URI} !^/(wiki|foo)$  <-- added
 RewriteRule   ^([a-z0-9]+)$            index.php?foobar=$1 [L]

另一种方法是使用例如正则表达式中的负向前瞻。例如:

 RewriteRule ^(?!(?:foo|wiki)$)([a-z0-9]+) ...

但我发现任何零宽度断言都非常复杂/脆弱/不直观,即使正常的正则表达式对你来说也很容易。

?是负面的预测 ?:只是“或”

的非捕获parens

关于这些问题最令人困惑的部分是,pcre努力寻找一种不满足消极前瞻的方法,换句话说,它很难有一个成功的整体匹配。