mod_rewrite - 当有一个时,RewriteCond QUERY_STRING不会捕获查询

时间:2014-09-05 13:35:44

标签: apache mod-rewrite redirect query-string

我正在与mod_rewrite斗争,并且无法弄清楚它以何种方式工作的原因。

这是关于找到处理友好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_URI} index.php(.*)是问题?或者mod_rewrite以某种方式反复说我要来回重定向查询并跳过程序?仍然不应该因为第二次重定向只发生在服务器端......

在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} ^(.+)$

没有$符号,也没有^,以及QUERY_STRING和多个重写组合,例如:

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]不会改变事物。

0 个答案:

没有答案