mod_rewrite:添加尾部斜杠?

时间:2010-06-28 14:14:36

标签: apache .htaccess mod-rewrite

我正在使用.htaccess文件将目录请求定向到自定义php文件,该文件提供有关该目录的信息(我希望浏览器显示的URL不会更改)。

这是.htaccess文件的相关部分。

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

如果你去一个目录并包含一个尾部斜杠,这很有效:

http://domain.com/path/

但没有尾随斜杠,它不会

http://domain.com/path

网址(显示在浏览器中)变为:

http://localhost:8888/path/?url=/path

我尝试通过在此规则之上添加规则来解决此问题:

RewriteCond %{REQUEST_FILENAME} -D
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L]

但那对我不起作用。

如果省略了斜杠,我怎么能得到.htaccess来添加尾部斜杠,然后就像它在那里一样?

谢谢

更新: 根据要求,这是完整的事情。

<IfModule mod_rewrite.c>
RewriteEngine On

#force trailing slashes on real directories
RewriteCond %{REQUEST_FILENAME} -D
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L]

#use the directory viewer on directories without an index page
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L]  

</IfModule>

4 个答案:

答案 0 :(得分:10)

这一行:

RewriteCond %{REQUEST_FILENAME} -D

应该是:

RewriteCond %{REQUEST_FILENAME} -d

答案 1 :(得分:6)

不要打扰Mod Rewrite,它有一个指令

<Location /some/path>
  DirectorySlash On
  SetHandler some-handler
</Location>

http://httpd.apache.org/docs/2.2/mod/mod_dir.html

答案 2 :(得分:0)

你的意思是

RewriteRule ^(.*)$ $1/ [L]

代替?

我不知道你的做法。我会尝试像

这样的东西
RewriteRule ^/(\S+)/?$ /myphp.php?url=$1

之前我用过它来重写它起作用了:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.com
RewriteRule ^(.*)$ http://www.domain.com$1
RewriteRule ^/(\S+)/?$ /myphp.php?url=$1

请注意,我没有在第一条规则中包含尾部斜杠。

另外,除非绝对必要,否则我建议你不要依赖.htaccess。这是因为服务器会不断检查.htaccess文件。使用httpd.conf文件意味着apache只会加载条件和规则一次。至少我被建议这样做。

答案 3 :(得分:0)

试试这个。它会向没有尾部斜杠的目录请求添加尾部斜杠。

<IfModule mod_rewrite.c>
RewriteEngine On

#use the directory viewer on directories without an index page
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*?)/?$ /myphp.php?url=$1/ [QSA,L]  

</IfModule>