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


17

我想进行一些URL重写(为什么?请参阅此问题。),以便用户不会看到类似这样的地址

labouseur.com/course-compilers.html 

他们可以简单地查看和使用

labouseur.com/course-compilers

(甚至更好,也许我应该对其进行重组,以使其成为课程/编译器。)

我正在为我的网站使用基于Linux的共享托管服务,因此我没有服务器的管理控制权,但可以控制.htaccess。我在网上阅读的参考文献对我来说还不太清楚,因此我在这里寻求一些澄清和建议。


请注意,这不是在服务器配置(.htaccess)中执行的操作。重要的第一步是实际更改应用程序中的URL,否则最终将导致大量不必要的重定向(或重复的内容)。
怀特先生

Answers:


13

您实际上可以从服务器上的文件中删除.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

这里有更多的复杂性,特别是如果您担心重复的内容问题。使用上述规则,您的页面仍然可以从旧的URL访问。
JasonBirch 2010年

3

首先,确保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如果可以的话,请确保您用来阻止它们的发生!


您是否介意在最后一点上做更多细节(使用RewriteCond停止循环)?
特拉维斯·诺斯卡特

2

除了上述答案外,还可以使用

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

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

(.*) 将会重写每个请求,无论这是否可能使其他后续规则失效,从而导致内部服务器访问错误。


您的RewriteRule 模式是对问题中给出的特定示例的可接受答案的一种改进,但是,如果存在多个路径段(例如),它将无法匹配更一般的情况。/path/to/course-compilers。包括该L标志以减少对以下规则的影响。尽管此(.*)模式不必要地通用,但由于存在检查文件的条件,因此不太可能引起严重问题。
怀特先生'17

1

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

不需要.htaccess。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.