使用重写时,Url包含子目录

时间:2014-11-12 21:49:28

标签: php apache .htaccess mod-rewrite

我刚将一个网站从一家托管公司转移到另一家托管公司。

在原始主机上我可以有一个像site.com/staff这样的网址,这实际上会使用RewriteRule调用index.php?page = staff。即使该主机具有名称为staff的子目录,这也可以工作。这不仅适用于员工页面,也适用于其他人员。

在新主机上,如果我调用site.com/staff并且有一个staff子目录,我会得到一个URL: 地址栏中的site.com/staff?page=staff。

我在两台主机上使用相同的.htaccess。

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^print/([^/\.]+)/?$ /print.php?page=$1 [R,NC,L]
RewriteRule ^([^/\.]+)[/]$ /$1 [NC,R]
RewriteRule ^([^/\.?]+)$ /index.php?page=$1 [NC,L]

我认为它可能是vhost.conf,httpd.conf或类似的设置。但是,我无法在原始主机上访问这些内容。

我可以找出解决方法,但我想尝试让新服务器像原始服务器一样工作。

1 个答案:

答案 0 :(得分:0)

这是由mod_dir和DirectorySlash引起的。默认情况下,apache将重定向目录的任何请求(无论重写规则如何),这些请求错过了带有斜杠的同一请求的尾部斜杠。这样人们就无法查看目录的内容。如果您缺少尾部斜杠,则无论您是否有索引文件,目录内容都会被暴露。此重定向会忽略可能会应用的任何可能的重写规则。

你需要做的是处理mod_rewrite中的尾部斜杠并关闭mod_dir:

DirectorySlash Off

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^print/([^/\.]+)/?$ /print.php?page=$1 [R,NC,L]
RewriteRule ^([^/\.]+)[/]$ /$1 [NC,R]
RewriteRule ^([^/\.?]+)$ /index.php?page=$1 [NC,L]

# in case there's a request for a directory that hasn't been handled
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L]