我无法弄清楚为什么这个RewriteCond不起作用

时间:2017-07-25 02:02:48

标签: apache .htaccess mod-rewrite

因此,我无法弄清楚为什么我的RewriteRules不会触发。这些规则位于我网站子域的根目录下的.htaccess文件中。我已经在VirtualHost中打开了mod_rewrite的详细日志记录,但这并没有真正帮助我解决错误,尽管前三条规则似乎只是巧合,因为它们的文件存在于请求的位置。

这套规则的目标是:
sub.domain.tld/ - > passthrough / serve actual file
sub.domain.tld/?q=test - > passthrough / serve查询args完整的实际文件
sub.domain.tld/.well-known/* - > passthrough / serve实际文件(用于letsencrypt)
sub.doamin.tld/* - > process.php?project=*
sub.domain.tld/*?q=test - >处理无限数量的查询参数时process.php?project=*&q=test

当前的.htaccess是:

RewriteEngine on
#serve actual file if viewing main page or doing https renewal
RewriteCond %{REQUEST_URI} ^\?.+|\/$ [OR]
RewriteCond %{REQUEST_URI} ^\.well-known.*
RewriteRule (.*) - [L,QSA]
#redirect everything else to the processing script
RewriteCond %{REQUEST_URI} ^(\w+)
RewriteRule \/(\w+) process.php?project=$1 [NC,L,QSA]

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

好的,这实际上是一个复杂的,因为大部分时间var car = Car("blah","blah","blah"); //car == undefined 测试是使用%{REQUEST_URI}本身完成的,我有点困惑,我很抱歉。

事实证明:

  • %{REQUEST_URI}包含前导斜杠
  • RewriteRule的匹配部分不

另外,请记住RewriteRule不包含查询字符串,如Apache手册中所述:

  

<强> REQUEST_URI   请求的URI的路径组件,例如“/index.html”。这显然排除了查询字符串,该字符串可用作名为QUERY_STRING的自己的变量。

因此,像%{REQUEST_URI}这样的规则几乎没用,因为RewriteCond %{REQUEST_URI} ^\?.+

中永远不会有问号

此外,这可能是最令人困惑的部分,当请求%{REQUEST_URI}时,/将包含已提供的实际索引文件。因此,如果您的%{REQUEST_URI}设置为DirectoryIndex(按此顺序)并且根文件夹中有index.php index.html个文件,则index.html将为{REQUEST_URI}。如果您有index.html个文件,则该文件为index.php,但永远不会为index.php

话虽如此,我们可以简单地将您的规则:

/

请注意,我在括号内添加RewriteEngine on RewriteCond %{REQUEST_URI} !^/(\.well-known|index\.php$) RewriteRule (.+) process.php?project=%{REQUEST_URI} [QSA] 仅匹配$之后的字符串结尾,但不匹配index\.php之后,\.well-known之后的所有内容也匹配

如果您有html索引,则需要将\.well-known替换为index\.php

最后,您不需要2条规则。只有一个并从中排除一些URL总是更好。

PS:您还会注意到您不需要转义index\.html,因为这不被视为正则表达式分隔符。

答案 1 :(得分:0)

您只需在.htaccess中使用此单一规则:

RewriteEngine on

# skip files, directories and anything inside .well-known/ directory
RewriteRule ^(?!index\.|process\.php|\.well-known)(.+)$ process.php?project=$1 [L,QSA,NC]