htaccess重写.html不是必需的/是可选的

时间:2014-05-03 11:06:01

标签: apache .htaccess mod-rewrite

我有一个工作网站,在谷歌排名至少500页。 所有页面在页面末尾都有.html。 现在我要删除所有网页的.html,但让Google中的网页(.html)保留索引。

搜索后我找不到正确的答案。 我知道吗?是可选的。我在彼此之后尝试了2条规则,但也没有工作。

这是我现在的htaccess:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*).html$ find_page.php?redirect=$1&%{QUERY_STRING} [L,QSA]

我尝试添加:

RewriteRule ^(.*)$ find_page.php?redirect=$1&%{QUERY_STRING}

因此,如果网址不包含扩展名,请使用此规则,否则请使用普通规则(使用htaccess

我应该期望我的规则应该是这样的:^(.*)(?\.html)$ 所以我的目标是:有或没有html应该工作,但.php不应该工作: - )

3 个答案:

答案 0 :(得分:0)

尝试

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$      $1.html

您不需要find_page.php进行重定向。正如其他答案中所提到的,http://server/folder/filehttp://server/folder/file.html对用户来说是相同的,但对Google来说则不同。

这不会影响PHP,文件夹和其他内容。它只是尝试将“.html”添加到请求的URL,如果它没有指向文件或文件夹。

我已经检查过,即使用户使用像1.html#bookmark1

这样的锚点查询uri,它也能正常工作

答案 1 :(得分:0)

好的解决了我的问题。

RewriteEngine On

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*[^.#?\ ]+\.html([#?][^\ ]*)?\ HTTP/ 
RewriteRule ^(([^/]+/)*[^.]+)\.html find_page.php?redirect=$1&%{QUERY_STRING} [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ find_page.php?redirect=$1&%{QUERY_STRING} [L,QSA]

使用此选项,将检查页面是否具有.html可选结尾。如果有,第一条规则将匹配,否则将更进一步使用最后没有html的第二条规则

答案 2 :(得分:0)

为什么要寻找复杂的解决方案?

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.html$ find_page.php?redirect=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)?$ find_page.php?redirect=$1 [L,QSA]

这会重写对该php脚本的所有请求,添加原始"文件名"作为参数"重定向"并保留所有查询参数。这就是你在问题中要求的。

但是警告:你可以这样做,它将允许重写请求,例如page"重定向"为.../redirection?somearg.../redirection.html?somearg。但对于谷歌而言,两个请求都是完全不同的页面。这将 not 帮助您在转换到新请求方案时保留任何评级。

一般的注意事项:如果你可以控制http服务器配置,那么总是更喜欢将这些规则放在hosts配置中而不是{ {1}}样式文件。众所周知,这些文件容易出错,使事情变得复杂,难以调试并且确实使服务器速度变慢。它们只应在两种情况下使用:如果您可以控制http服务器配置,或者您需要脚本对规则集进行动态更改(这一直是一种非常不安全的事情)。

相关问题