我知道这是一个非常常见的主题,但没有一个解决方案适合我.我试过几个答案:
和推荐链接.
我正在使用的htaccess代码:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)
然后我将我的链接从services.html更改为服务,即我删除了扩展名,并使用ftp从文件名中删除了扩展名.
我得到的是我的浏览器中显示的页面代码而不是实际的页面.
我在我的服务器上检查了mod_rewrite,它使用此代码正常工作
RewriteEngine On
Options +FollowSymLinks
RewriteRule ^joomla\.html http://www.joomla.org/? [R=301,L]
Run Code Online (Sandbox Code Playgroud)
您的文件仍应.html在服务器上具有扩展名,否则服务器/浏览器不会将其解释为html而是文本(这是您在浏览器中看到代码的原因).因此,再次使用ftp重命名服务器上的文件.
为了让您的服务器在访问/test.htmlURL时提供文件/test,您需要在内部重写,即:
RewriteRule ^test[^/]$ test.html
Run Code Online (Sandbox Code Playgroud)
该^是字符串,则开始匹配$比赛结束,所以如果网址完全一致,这只会改写test.它会重写该请求test.html.重写是内部的,这意味着它不会重定向浏览器(地址栏中的URL不会更改).还有外部重写([R]附加到规则),它重定向浏览器.
此规则也仅匹配不以尾部斜杠结尾的URL([^/]表示"不斜杠").稍后我们将使用尾部斜杠处理网址.
您可以RewriteRule为要重写的每个页面创建自定义:
RewriteRule ^foo[^/]$ foo.html
RewriteRule ^bar[^/]$ bar.html
Run Code Online (Sandbox Code Playgroud)
如果你有很多页面,这是很多工作,所以你可能想要重写所有的网址,例如foo或者bar应该重写为foo.html/ bar.html,并且foo/bar应该重写foo/bar.html.
您还可以使用正则表达式来匹配所有请求.但是你应该首先检查foo一个目录是否真的不是一个目录(它可能包含一个index.html你想要服务的子目录).您还想检查foo服务器的文件系统上是否真的不是文件.有两个重写条件来检查(参见RewriteCond指令):
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
Run Code Online (Sandbox Code Playgroud)
现在,您可以为所有请求添加重写规则:
RewriteRule ^(.+[^/])$ $1.html
Run Code Online (Sandbox Code Playgroud)
$1是第一个捕获组的内容,正则表达式中的捕获组是放在()括号中的表达式..匹配任何字符,+修饰符表示"一个或多个".
请注意,这会导致重写循环导致500错误(请参阅此答案),因此您还需要添加重写条件以检查<request>.html文件系统上是否确实存在该文件:
RewriteCond %{REQUEST_FILENAME}.html -f
Run Code Online (Sandbox Code Playgroud)
您也可能不想重写已有.html扩展名的网址.我不认为这是必要的,因为你已经有了上面的规则,在那种情况下检查<file>.html.html哪些可能不存在.但是如果你必须处理它,你可以添加另一个条件:
RewriteCond %{REQUEST_FILENAME} !^.+\.html$
Run Code Online (Sandbox Code Playgroud)
所以完全把你的重写规则看起来像这样:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !^.+\.html$ # not really necessary
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+[^/])$ $1.html
Run Code Online (Sandbox Code Playgroud)
您现在唯一需要处理的是具有尾部斜杠的网址.为此,我们只添加一个简单的外部重写规则,如果url实际上与目录不匹配,则删除尾部斜杠:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [R,L]
Run Code Online (Sandbox Code Playgroud)
此规则仅匹配以/(regex /$)结尾的URL 并在尾随斜杠之前捕获所有内容作为一个组(正则表达式(.+)),然后重定向到该组(不包含斜杠).注意规则背后的标志R和L 标志.R用于重定向,重定向浏览器(地址栏中的URL更改).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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7223 次 |
| 最近记录: |