我有一个问题,Apache传递给PHP $_SERVER['REQUEST_URI']variables的URL重写后,而不是原来的请求。
我正在做这个重写,因为我有一个WordPress的网站,并希望将其移动到一个子目录,而不是在根path中,但仍然希望保持其URL为根URL。 这并不一致。 如果我请求www.xyz.com/wp-admin它将使用www.xyz.com/wordpress/wp-admin (这是重写后的URL)填充PHP REQUEST_URIvariables,但是如果我请求www.xyz.com/wp-admin/ (带有斜线),它实际上使用www.xyz.com/wp-admin/ (原始URL,在重写之前)填充PHP REQUEST_URIvariables。 我想要的是在REQUEST_URI被重写之前填充URL。
我的.htaccess文件如下:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^(www.)?xyz.com$ RewriteCond %{REQUEST_URI} !^/wordpress/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /wordpress/$1 RewriteCond %{HTTP_HOST} ^(www.)?xyz.com$ RewriteRule ^(/)?$ wordpress/index.php [L] </IfModule>`
PHP版本是5.3。 Apache版本是2.4(Win32)。
更新 :我更深入地研究它,当我inputurlwww.xyz.com/wp-admin首先有一个301redirect到www.xyz.com/wordpress/wp-admin/但是这不会发生www.xyz.com/wp-admin/ (带有斜线)。 对于具有斜线的那个,只有重写,如预期的那样。 所以现在的问题是为什么301redirect发生在URL的第一个地方没有结尾的斜杠。 为了澄清,没有实际的文件夹/wp-admin/ ,但是有一个文件夹/wordpress/wp-admin/ 。
“问题”与mod_dir有关(尽pipemod_dir并不是严格的“问题” – 它正在做正确的事情并“修复”URL)。
由于wp-admin是一个物理目录,mod_dir通过附加一个尾部的斜线(为了正确地服务目录索引,例如index.php )来“修复”URL。 它用301redirect来做到这一点。 问题是,这是发生在你的内部重写,导致重写变成一个redirect,从而暴露你的/wordpress子目录。
所以,正确的URL是严格的/wp-admin/ (带有斜线)。 如果你没有你的/wordpress子目录,并且一切都在文档根目录下,那么mod_dir会简单地将/wp-adminredirect到/wp-admin/ ,这会导致/wp-admin/index.php被服务一个内部子请求)。
你需要做的是手动追加尾部斜线。 如果所请求的URL不以斜线结尾,而是映射到/wordpress子目录中的物理目录,则附加斜杠(通过外部redirect)。 这个redirect应该在内部重写之前进行 。
因此,请在现有的指令之前尝试以下操作:
# Append a slash if it is omitted and would map to a directory RewriteCond %{REQUEST_URI} !^/wordpress/ RewriteCond %{REQUEST_URI} !/$ RewriteCond %{DOCUMENT_ROOT}/wordpress/$1 -d RewriteRule (.*) /$1/ [R=302,L]
这样做的是,对于任何尚未开始/wordpress/请求,不会以斜线结尾,而是映射到/wordpress子目录中的物理目录,然后redirect并追加一个斜杠。 所以, /wp-admin的请求获取redirect/wp-admin/ ,提供/wordpress/wp-admin作为目录。 (您的内部重写然后像以前一样路由URL。)
您将需要确保您的浏览器caching被清除(或testing浏览器对象检查器打开并禁用caching),因为早先的301redirect(由mod_dir)将被caching。
当你确定它工作正常,那么将302 (临时)redirect改为301 (永久) – 如果是这样的话。 302s被浏览器caching,所以使testing更容易。