尾部斜杠问题

6
当我输入 "http://example.com/Hello%20There/"时,它会显示索引页面,即:"http://example.com/Hello%20There/index.html"。
那么,我想做的是当用户输入 "http://example.com/Hello%20There"(就像第一个链接一样,只是没有尾随斜杠),怎么办呢?
我尝试了很多东西,特别是正则表达式,但是什么都没有起作用,因为我认为服务器在发现空格(URL中的 "%20")时会停止正则表达式的处理。
我尝试了这个正则表达式:
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] 

and also put:

DirectorySlash On 

在Apache的“mod_dir”模块中。 所以,我的问题是: - 如何告诉服务器在用户输入没有斜线的URL时添加一个斜线;$
3个回答

15

您可以通过在字符后添加?量词使其变为可选项,例如:

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]

这些规则可以删除或添加缺失的尾部斜杠,并进行永久重定向。


你在第二个重写规则中漏掉了括号。 - Alex Velickiy
请问最终要使用哪个规则组合?我对这个问题非常感兴趣,但是我无法使其正常运行...谢谢。 - Marc Gil Sendra

2

我曾经遇到同样的问题,但我使用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程序作为子站点,这就是一开始引起所有混乱的原因...

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接