htaccess重定向与现有重写规则冲突

时间:2013-07-25 16:18:36

标签: apache .htaccess mod-rewrite

我将所有传入网址的请求转换为GET参数,因此fruits.com/apple变为fruits.com/?url=apple,我的路由机制负责显示正确的视图。

的.htaccess

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteRule .* index.php?url=$0 [QSA,L]

这很好用。但是我现在有一些例外,我希望这些URL重定向到主页。 Redirect与上述规则冲突:

Redirect /pineapple /
Redirect /grapes /

这会重定向到fruits.com/?url=pineapple,而不仅仅是fruits.com

如何进行干净重定向到fruits.com

可怕的解决方案

我可以想到一个解决方案,除了几个例外之外,它非常不优雅:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteCond %{REQUEST_URI} !^/pineapple$
RewriteCond %{REQUEST_URI} !^/grapes$
RewriteRule .* index.php?url=$0 [QSA,L]

Redirect /pineapple /
Redirect /grapes /

3 个答案:

答案 0 :(得分:3)

用以下代码替换您的代码:

通过httpd.conf启用mod_rewrite和.htaccess,然后将此代码放在.htaccess目录下的DOCUMENT_ROOT中:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

RewriteRule ^(pineapple|grapes)/? /? [L,NC,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteRule .+ index.php?url=$0 [QSA,L]

答案 1 :(得分:1)

在代码方面,我们不太关心优雅,更关心绩效。

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteCond %{REQUEST_URI} !^/(pineapple|grapes)/?$
RewriteRule .* index.php?url=$0 [QSA,L]

RewriteRule (pineapple|grapes)/? / [R,L]

如果您有httpd.conf的访问权限,则可以使用rewritemap,如果您关心它的外观。

答案 2 :(得分:1)

使用R标志而不​​是Redirect切换到RewriteRule。如果此规则匹配,您还将使用RewriteRule上的L标志告诉Apache移动以停止处理其他规则。所以你把它放在你的其他规则之上

RewriteEngine on

RewriteRule ^pineapple / [R=301,L]
RewriteRule ^apple / [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteRule .* index.php?url=$0 [QSA,L]