我将所有传入网址的请求转换为GET参数,因此fruits.com/apple
变为fruits.com/?url=apple
,我的路由机制负责显示正确的视图。
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 /
答案 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]