使用htaccess文件删除html扩展名

时间:2016-08-22 11:26:29

标签: html .htaccess

我知道这是一个非常常见的话题,但没有一个解决方案适合我。 我试过几个答案:

answer 1

answer 2

answer 3

和推荐链接。

我正在使用的htaccess代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

然后我将我的链接从services.html更改为服务,即我删除了扩展名,并使用ftp从文件名中删除了扩展名。

我得到的是我的浏览器中显示的页面代码而不是实际页面。

我已在服务器上检查了mod_rewrite,并且使用此代码正常工作

RewriteEngine On
Options +FollowSymLinks
RewriteRule ^joomla\.html http://www.joomla.org/? [R=301,L]

2 个答案:

答案 0 :(得分:9)

您的文件仍应在服务器上具有.html扩展名,否则服务器/浏览器不会将其解释为html而是将其解释为文本(这是您在浏览器中看到代码的原因)。因此,再次使用ftp重命名服务器上的文件。

为了让您的服务器在访问网址/test.html时提供文件/test,您需要在内部重写,即:

RewriteRule ^test[^/]$ test.html

^匹配字符串的开头,$与结尾匹配,因此只有在网址与test完全匹配时才会重写。它会将该请求重写为test.html。重写是内部的,这意味着它不会重定向浏览器(地址栏中的URL不会更改)。还有外部重写(规则附加[R]),它会重定向浏览器。

此规则也仅匹配不以尾部斜杠结尾的网址([^/]表示“不斜杠”)。稍后我们将使用尾部斜杠处理网址。

您可以为要重写的每个页面创建自定义RewriteRule

RewriteRule ^foo[^/]$ foo.html
RewriteRule ^bar[^/]$ bar.html

如果你有很多页面,这是很多工作,所以你可能想要重写所有的网址,例如应将foobar重写为foo.html / bar.html,并将foo/bar重写为foo/bar.html

您还可以使用正则表达式来匹配所有请求。但是,您应首先检查foo实际上不是一个目录(可能包含index.html并且是您要提供的子目录)。您还想检查foo是否真的不是服务器文件系统上的文件。有两种重写条件可以检查(参见RewriteCond directive):

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

现在,您可以为所有请求添加重写规则:

RewriteRule ^(.+[^/])$ $1.html

$1是第一个捕获组的内容,正则表达式中的捕获组是放在()括号中的表达式。 .匹配任何字符,+修饰符表示“一个或多个”。

请注意,这会导致重写循环导致500错误(see this answer),因此您还需要添加重写条件以检查文件系统上是否实际存在<request>.html文件:

RewriteCond %{REQUEST_FILENAME}.html -f

此外,您可能不想重写已有.html扩展名的网址。我不认为这是必要的,因为你已经有了上面的规则,在那种情况下检查<file>.html.html可能不应该存在。但是如果你必须处理它,你可以添加另一个条件:

RewriteCond %{REQUEST_FILENAME} !^.+\.html$

总而言之,你的重写规则如下:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !^.+\.html$ # not really necessary
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+[^/])$ $1.html

您现在唯一需要处理的是具有尾部斜杠的网址。为此,我们只添加一个简单的外部重写规则,如果url实际上与目录不匹配,则删除尾部斜杠:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [R,L]

此规则仅匹配以/(正则表达式/$)结尾的网址,并在尾随斜杠之前捕获所有内容(正则表达式(.+)),然后重定向到该组(其中不包含斜杠)。请注意规则背后的RL flagsR用于重定向,用于重定向浏览器(地址栏中的网址更改)。 L是最后一个,意味着在此之后不会应用其他规则,但重写后将再次应用规则,这是应用其他规则的地方。

<强> TL; DR

RewriteBase /

# handle trailing slashes (if not a directory)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [R,L]

# rewrite rule that internally adds the .html extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+[^/])$ $1.html

答案 1 :(得分:-1)

像@simon一样建议正确的文件是:

Do Until b.Worksheets(1).Range("A" & j).Value = ""
    sa = CleanString(a.Worksheets(1).Range("B" & i).Value)
    sb = CleanString(b.Worksheets(1).Range("C" & j).Value)
    oa = CleanString(a.Worksheets(1).Range("E" & i).Value)
    ob = CleanString(b.Worksheets(1).Range("F" & j).Value)
        If StrComp(sa, sb) = 0 And StrComp(oa, ob) = 0 Then
            Passed = True

我还必须通过ftp从服务器中删除所有具有相同名称的文本文件。