0

我有一个 htaccess 问题,我认为它可能非常简单(愚蠢?),以前没有人问过。我从使用 html 页面转换为 php,并且在大多数情况下,以下工作有效:

<IfModule mod_rewrite.c>
 Options +FollowSymlinks
 RewriteEngine on
 RewriteRule ^(.+)\.htm$ /htmlrewrite.php?page=$1 [R=301,NC,L]
</IfModule>

不过有几个例外,所以我假设:

Redirect 301 /oldpage.htm http://example.com/newpage.php

在 IfMofule... 上方可以解决问题,但事实并非如此。除非我删除其余代码,否则“重定向 301”将被忽略。有人可以告诉我我做错了什么吗?

TIA。

4

2 回答 2

0

Apache 首先处理 mod_rewrite (Rewrite*),然后处理 mod_alias (Redirect)。

用于RewriteCond防止 /oldpage.htm 被 mod_rewrite 处理。

RewriteCond %{REQUEST_URI} !^/oldpage\.htm$
RewriteRule ^(.+).htm$ /htmlrewrite.php?page=$1 [R=301,NC,L]

或使用RewriteRule代替Redirect.

RewriteRule ^oldpage\.htm$ http://example.com/newpage.php [L,R=301]
RewriteRule ^(.+).htm$ /htmlrewrite.php?page=$1 [R=301,NC,L]
于 2012-12-11T12:15:37.900 回答
0

您同时使用 mod_rewrite 和 mod_alias 并且它们都被应用到同一个 URL。您应该坚持使用 mod_rewrite 或 mod_alias。

mod_rewrite:(删除Redirect指令)

<IfModule mod_rewrite.c>
 Options +FollowSymlinks
 RewriteEngine on
 RewriteRule ^oldpage.htm$ http://example.com/newpage.php [R=301,L]
 RewriteRule ^(.+)\.htm$ /htmlrewrite.php?page=$1 [R=301,NC,L]
</IfModule>

mod_alias:(删除<IfModule mod_rewrite.c>块中的所有内容:

Options +FollowSymlinks
Redirect 301 /oldpage.htm http://example.com/newpage.php
RedirectMatch 301 ^/(.+)\.htm$ /htmlrewrite.php?page=$1
于 2012-12-11T12:15:46.927 回答