因此,我无法弄清楚为什么我的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]
感谢您的帮助!
答案 0 :(得分:1)
好的,这实际上是一个复杂的,因为大部分时间var car = Car("blah","blah","blah"); //car == undefined
测试是使用%{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]