2010-01-05 130 views
5

当我输入“http://example.com/Hello%20There/”时,它会显示 索引页,它是:“http://example.com/Hello%20There/index.html”。尾部斜杠问题

那么,我想要做的是,当用户键入“http://example.com/Hello%20There” (所以像第一个,除了它没有一个结尾的斜杠)。

我尝试了很多东西和特殊的正则表达式,但没有任何效果,因为我认为 服务器在找到空格(URL中的“%20”)时会停止reg exp过程。

我想这REG EXP:

Options +FollowSymLinks 
rewriteEngine On rewriteCond %{REQUEST_URI} ^(.*)\ (.*html)$ 
rewriteRule ^.*$ %1-%2 [E=space_replacer:%1-%2] 
rewriteCond %{ENV:space_replacer}!^$ 
rewriteCond %{ENV:space_replacer}!^.*\ .*$ 
rewriteRule ^.*$ %{ENV:space_replacer} [R=301,L] 

,并也提出:

DirectorySlash On 

阿帕奇 “mod_dir” 模块中。

所以,我的问题是: - 如何判断服务器添加一个尾随斜线当用户键入一个URL 不带后缀斜线; $

回答

13

你可以让一个角色可选通过附加?量词它是这样的:

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

现在无论/foobar/foobar/将被改写为/foobar/index.html

但它会更好,如果你只使用一个拼写,有或没有结尾的斜线,然后重定向另一个:

# remove trailing slash 
RewriteRule (.+)/$ /$1 [L,R=301] 

# add trailing slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .*[^/]$ /$1/ [L,R=301] 

这些规则或者删除或添加缺少的斜线,做一个永久的重定向。

+0

你错过了在第二重写规则括号。 – 2017-09-06 11:49:55

+0

请问,这是最终使用的规则组合吗?我对这个问题非常感兴趣,而且我无法正常运行......谢谢 – 2017-11-09 11:26:55

1

我有同样的问题,但我使用mod_alias建立一个子网站。事实证明,我需要制作第二个别名而没有斜线,这样它才能正常工作。看起来是这样的:

Alias /forum/ "/var/www/forum" 
Alias /forum "/var/www/forum" 

<Directory "/var/www/forum"> 
    Options FollowSymlinks 
    AllowOverride None 
    Order allow,deny 
    Allow from all 
</Directory> 

在Ubuntu中,我不得不编辑/etc/apache2/mods-enabled/alias.conf文件,这些线,然后重新启动Apache。无法在网络上的任何位置找到此答案;由于mod_rewrite无法正常工作,而且DirectorySlash命令也无济于事,我只是偶然发现了它。我在Drupal安装下追加了一个非Drupal程序作为子网站,这是首先引发了所有这些疯狂的事情......