使用htaccess强制虚拟目录上的目录斜杠

时间:2012-11-18 09:50:17

标签: php apache .htaccess mod-rewrite rewrite

我理解如何将目录斜杠添加到实际目录中,但我需要在虚拟目录上添加尾部斜杠 - 这样,当用户访问 example.com/website/blog/entries 时( 其中/ blog& / entries都是虚拟目录),URL地址将物理上更改为: example.com/website/blog/entries /

这是我当前正在使用的htaccess代码,用于将虚假/虚拟目录转换为我的php脚本的参数:

RewriteRule ^/?([a-zA-Z_\-/.]+)$ index.php?file=$1 [L,QSA]  

RewriteRule 使 example.com/website/blog/entries / 看起来像 example.com/website/index.php?file=blog/entries / 仅限PHP,而不是用户。

以下是我尝试过无效的一些重写规则:

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

# -----------------------------------------------

RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^.+/$ %1 [R=301,L]

我认为问题是因为我当前将虚拟目录转换为参数的正则表达式查找以“/”开头的目录名称,因此当站点安装不在根文件夹(“/”)中时,或者如果有它不是一个斜杠,它重定向到一个完全错误的东西。我无法在htaccess文件中的任何位置编写文件夹路径,因为路径会不断变化。例如,我不能使用类似的东西:

RewriteRule ^(.*)$ http://localhost:8888/project/$1/ [L,R=301]

有没有办法在实际和虚拟目录上强制使用斜杠, BEFORE 将虚拟目录转换为PHP参数?

1 个答案:

答案 0 :(得分:1)

以下内容应该满足您的需求:

RewriteEngine On

# Put here the URL where .htaccess is located
RewriteBase /project/

# Redirect virtual URLs w/o trailing slash to URL with it
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*[^/])$ $1/ [R=301,QSA,L]

# pass virtual URLs into index.php as file argument
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([a-zA-Z_\-/.]+)$ index.php?file=$1 [L,QSA]

规则按照它们在配置中出现的顺序进行处理,因此重定向在将数据传递到index.php之前完成

以下是使用RewriteBase并使用URL的硬编码部分的版本:

RewriteEngine On

# Redirect virtual URLs w/o trailing slash to URL with it
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.*[^/])$
RewriteRule .* %1/ [R=301,QSA,L]

# pass virtual URLs into index.php as file argument
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/?([a-zA-Z_\-/.]+)$
RewriteRule .* index.php?file=%1 [L,QSA]