it-swarm.cn

如何在.htaccess文件中实现URL重写?

我想做一些URL重写(为什么?看 这个问题 。)这样代替用户看到的地址就像

labouseur.com/course-compilers.html 

他们可以简单地看到和使用它们

labouseur.com/course-compilers

(甚至更好,也许我应该重组它,以便它的课程/编译器。)

我正在为我的网站使用基于Linux的共享托管服务,所以我没有对服务器的管理控制,但我确实可以控制.htaccess。我在网上看到的参考资料对我来说似乎不太清楚,所以我在这里寻找一点清晰度和建议。

17
Alan

您实际上可以从服务器上的文件中删除.html并在htaccess中设置设置,以便将它们作为html文件提供,但这可能不是您想要的。

做这个 :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html
13
Rizwan Kassim

首先,确保Apache具有该模块,并且允许在.htacces文件中使用,然后添加:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

你的例子需要

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

对于单级目录结构和

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

对于多层次结构。

但是小心

如果你有结构

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

.htaccess文件中的重写规则将相对于其父文件夹,您可以进入一些凌乱重写循环情况。如果可以,请确保使用RewriteCond来阻止它们发生!

3
Aiden Bell

作为上述答案的补充,可以使用

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+)允许使用连字符( - )的字母,数字。

(.*)将重写每个请求,这可能会影响其他以下规则,导致访问时出现内部服务器错误。

2
Abhishek Gurjar

您不必使用.htaccess文件来完成此操作。只需将文件结构化为目录,而不是使用“labouseur.com/course-compilers.html”,只需将文件命名为index.html并将其放入名为“course-compilers”的目录中。然后,当您指向该目录时,默认情况下会提供索引,但不会在URL中显示。所以你可以把你的链接写成“labourseur.com/course-compilers”,一切都会好的。

不需要.htaccess。

1
Joel Glovier