需要使用标志吗? 的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解决方案,避免循环。
答案 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努力寻找一种不满足消极前瞻的方法,换句话说,它很难有一个成功的整体匹配。