2

我将所有传入我网站的 URL 请求都转换为 GET 参数,因此我fruits.com/applefruits.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 /
4

3 回答 3

3

用这个替换你的代码:

通过启用 mod_rewrite 和 .htaccess httpd.conf,然后将此代码放在您.htaccessDOCUMENT_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]
于 2013-07-25T16:46:57.863 回答
1

切换到带有 R 标志的 RewriteRule 而不是 Redirect。如果此规则匹配,您还将使用 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]
于 2013-07-25T16:39:06.010 回答
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 。

于 2013-07-25T16:30:29.233 回答