Apache mod_rewrite-RewriteCond QUERY_字符串在有查询时不捕获查询

Apache mod_rewrite-RewriteCond QUERY_字符串在有查询时不捕获查询,apache,mod-rewrite,redirect,query-string,Apache,Mod Rewrite,Redirect,Query String,我正在与mod_重写作斗争,无法找出它以这种奇怪的方式工作的原因 这是关于找到处理友好URL的最佳方法 让我们假设域是trojka-poligrafia.pl/ 要实现的效果是:查询?s=之后发生的任何事情都是应该重写的友好链接参数,例如: trojka-poligrafia.pl/whateva?s=portfolio -> trojka-poligrafia.pl/portfolio trojka-poligrafia.pl/index.php?s=portfolio -

我正在与mod_重写作斗争,无法找出它以这种奇怪的方式工作的原因

这是关于找到处理友好URL的最佳方法

让我们假设域是trojka-poligrafia.pl/

要实现的效果是:查询?s=之后发生的任何事情都是应该重写的友好链接参数,例如:

trojka-poligrafia.pl/whateva?s=portfolio   ->   trojka-poligrafia.pl/portfolio

trojka-poligrafia.pl/index.php?s=portfolio   ->   trojka-poligrafia.pl/portfolio
即使是这样的混乱:

trojka-poligrafia.pl/whateva;params,there,are?s=portfolio;klient,15   ->   trojka-poligrafia.pl/portfolio;klient,15
以上所有操作都正常工作,但有一个查询RewriteCond无法捕获/处理:

trojka-poligrafia.pl/?s=portfolio -> trojka-poligrafia.pl/portfolio
这种重定向从未发生过,我也找不到任何原因

.htaccess处理重定向的规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1? [R=301,L]
也许是一些早期或后期的指令造成了这种情况? 所有.htaccess内容:

DirectoryIndex index.php
Options FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} !^trojka-poligrafia\.pl.*
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1 [R=301,L]
RewriteCond %{REQUEST_URI} index.php(.*)
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1 [R=301,L]

#catch query and translate into real friendly link
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1? [R=301,L]

#translate friendly link for php, no visitor redirecting
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} !^.+
RewriteRule ^(.+)$ \?s=$1 [L]
可能是
RewriteCond%{REQUEST\u URI}index.php(.*)
有问题吗?或者mod_重写forsees,让我来回重定向查询并跳过这个过程?但不应该这样,因为第二次重定向只发生在服务器端

在Justin的评论之后,我终于找到了使URL友好的工作方式:

DirectoryIndex index.php
Options FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} !^trojka-poligrafia\.pl.*
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1 [R=301,L]
RewriteCond %{REQUEST_URI} index.php(.*)
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1 [R=301,L]

RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
但在重定向后,无论是否使用下一个规则,它们都会生成错误。我尝试过多种组合,但都不起作用:

RewriteCond %{REQUEST_URI} ^/(.*)$

RewriteCond %{REQUEST_URI} ^(.*)$

RewriteCond %{REQUEST_URI} ^/(.+)$

RewriteCond %{REQUEST_URI} ^(.+)$
也不带$符号,也不带^,也不带查询字符串,以及重写规则的多种组合,例如:

RewriteRule ^(.*)$ \?s=$1 [L]

RewriteRule ^(.*)$ s=$1 [L]

RewriteRule ^(.*)$ /?s=$1 [L]
以及.+而不是。*和%1而不是$1。。。。。。。它们都返回错误

经过一点尝试后,我认为这一点应该有效:

DirectoryIndex index.php
Options FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} !^trojka-poligrafia\.pl.*
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1 [R=301,L]
RewriteCond %{REQUEST_URI} index.php(.*)
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1 [R=301,L]

RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule ^(.*)$ http://trojka-poligrafia.pl/%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.*)$
RewriteRule ^(.*)$ \?s=%1 [L]
但它不。。。最后一个重写规则必须是原因,但仍不知道为什么它与浏览器通信,当它是:

RewriteRule ^(.*)$ http://anydomain.com/\?s=%1 [L]

它工作正常。使用[L,PT]不会改变任何事情。

以上所有功能都能正常工作
。我认为它不适用于
trojka poligrafia.pl/index.php?s=portfolio
,因为如果请求现有文件/文件夹,您的规则不适用。只需删除规则之前的2
RewriteCond
。你的代码中也有一些语法错误好吧,我明白了。实际上没有考虑排除index.php。删除您指出的这些指令是否安全?语法错误-你是说上次重写规则?或者第一条?更重要的是:删除这两条指令后,浏览器会检测到trojka-poligrafia.pl2的任何请求的错误重定向。更重要的是:删除这两条指令后,无论是否需要进一步的规则、参数或解决方案,我得到的只是错误消息。