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