我需要将edit/profil
重定向到edit.php?p=profil
,但p
参数不会发送到edit.php
。你知道这可能是什么原因吗?
服务器是共享服务器,因此我无权访问Apache配置文件。
我的文件夹位于/fr/intranet
,其中包含两个文件:edit.php
和.htaccess
。
edit.php
的内容非常简单:
<?php
echo '<pre>';
echo "This is edit.php\n";
var_dump($_GET);
echo '</pre>';
?>
.htaccess
的内容如下:
Options +FollowSymlinks
RewriteEngine on
RewriteBase /fr/intranet/
RewriteRule ^edit/profil/?$ edit.php?p=profil [L]
RewriteRule ^test/profil/?$ edit.php?p=profil [L]
当我加载/fr/intranet/test/profil
时,PHP脚本会显示:
This is edit.php
array(1) {
["p"]=>
string(6) "profil"
}
当我加载/fr/intranet/edit/profil
时(这就是我在这里发布的原因),PHP脚本会显示:
This is edit.php
array(0) {
}
在/ fr /文件夹中安装了一个带有.htaccess的Wordpress。我想知道它是否可能有一些重写规则与我的冲突。它不应该,因为我的htaccess优先。此外,没有规则可能产生我遇到的行为:
RewriteEngine On
RewriteBase /fr/
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
我知道QSA旗帜,但这不是问题所在。如果我已正确理解,QSA标志在重定向时会查找整个URL(包括GET参数),但我在请求的URL中没有GET参数。无论如何,添加它不会改变行为。
如果我使用以下内容创建名为/fr/intranet/test.php
的文件:
<?php
echo '<pre>';
echo "This is test.php\n"
var_dump($_GET);
echo '</pre>';
?>
如果我加载/fr/intranet/test/profil
,那么我得到以下输出:
This is test.php
array(0) {
}
此外,如果我删除.htaccess
文件,则加载/fr/intranet/test
会显示/fr/intranet/test.php
的输出。
一切都表现得像一个隐藏的规则或多或少像这个:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^([^/]+).*$ $1.php [L]
我发现here在.htaccess
文件中关闭然后关闭RewriteEngine可能会禁用父重写规则。但它并没有解决我的问题。
答案 0 :(得分:2)
尝试禁用MultiViews(Options -MultiViews
),在这种情况下通常应该责怪它。
(有关MultiViews做什么的更详细说明,请参阅http://httpd.apache.org/docs/2.2/en/mod/mod_negotiation.html#multiviews。当一个人试图重写的“假”路径段存在时,这通常会干扰重写时具有相同名称[减去扩展名]的文件。 )