2

我的 .htacess 中有以下代码,但它不能正常工作。是不是因为 mod-rewrite 没有“开启”,如果是这样,我该如何检查?

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.*)\$ $1.php [nc]

我想重命名我的地址,例如:

http://www.abc.com -> http://www.abc.com

http://abc.com -> http://www.abc.com

http://www.abc.com/123.html -> http://www.abc.com/123

http://www.abc.com/12-12-12.html -> http://www.abc.com/12-12-12

http://subdomain.abc.com/123.html -> http://subdomain.abc.com/123

基本上删除扩展名并确保其 www 完好无损。

编辑:

它被改写成

Options +FollowSymlinks
RewriteEngine on
RewriteCond % ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
RewriteRule ^(.*).php $1

但仍然无法正常工作

4

4 回答 4

5

第1步。

更改所有链接以.html从链接中删除。确保您已Multiviews关闭:

Options -Multiviews

第2步。

当主机名中缺少 www 时,您需要规则来重定向浏览器:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

步骤 3。

当请求带有或已删除扩展名的 URL 时,您需要规则来重定向浏览器:.html.php

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /([^\ ]+)\.(php|html?)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ /%2 [L,R=301]

第4步。

如果请求实际上是针对 php 或 html 文件,则需要规则来内部重写URI:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.htm -f
RewriteRule ^(.*)$ /$1.htm [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ /$1.html [L]

.htaccess

所以总而言之,你应该在你的 htaccess 中有这些规则(放弃你可能已经尝试解决这个问题的任何规则):

# Make sure Multiviews is off
Options -Multiviews

# turn on rewrite engine
RewriteEngine On

# Redirect requests that are missing www and not a subdomain
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

# Redirect if requests is for a .htm, .html, or .php
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /([^\ ]+)\.(php|html?)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ /%2 [L,R=301]

# rewrite to the proper extension if such a file exists
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.htm -f
RewriteRule ^(.*)$ /$1.htm [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ /$1.html [L]

总而言之:

  • 如果浏览器 URL 地址栏显示:http ://example.com/index.html它将被重定向到http://www.example.com/index
  • 如果浏览器 URL 地址栏显示:http ://www.example.com/index它将显示http://www.example.com/index.html的内容(或者index.php如果存在)。地址栏保持不变。
  • 如果浏览器 URL 地址栏显示:http://foo.example.com/images/image.png您将在/images/image.png. 地址栏保持不变。
  • 如果浏览器 URL 地址栏显示:http: //foo.example.com/path/foo/bar.php它将被重定向到http://foo.example.com/path/foo/bar
  • 如果浏览器 URL 地址栏显示:http://foo.example.com/path/foo/bar它将显示在http://foo.example.com/path/foo/bar.php的内容。地址栏保持不变。
于 2012-10-03T05:12:30.510 回答
0

删除.html

RewriteRule ^(.*).html $1 [L,QSA]

添加万维网。

RewriteCond % ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
于 2012-09-23T15:31:39.223 回答
0

您的网站位于哪个主机上?您确定启用了 mod-rewrite 吗?如果未激活,您是否联系过您的主机安装它?

之前由 androbin ( https://stackoverflow.com/a/12553613/1713771 ) 发布的解决方案是正确的。

于 2012-10-02T09:27:50.267 回答
0

我使用的.htaccess文件:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.html -f
    RewriteRule ^(.*)$ $1.html
</IfModule>

这将删除.html文件扩展名并强制www.

于 2012-10-02T19:26:02.047 回答