.htaccess url重写并与现有文件名冲突

时间:2014-07-12 16:54:06

标签: php .htaccess mod-rewrite

问题:

我需要将edit/profil重定向到edit.php?p=profil,但p参数不会发送到edit.php。你知道这可能是什么原因吗?

详细说明:

服务器是共享服务器,因此我无权访问Apache配置文件。 我的文件夹位于/fr/intranet,其中包含两个文件:edit.php.htaccessedit.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) {
}

到目前为止我测试了什么

父.htaccess冲突

在/ 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旗帜,但这不是问题所在。如果我已正确理解,QSA标志在重定向时会查找整个URL(包括GET参数),但我在请求的URL中没有GET参数。无论如何,添加它不会改变行为。

创建test.php

如果我使用以下内容创建名为/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]

RewriteEngine off / on

我发现here.htaccess文件中关闭然后关闭RewriteEngine可能会禁用父重写规则。但它并没有解决我的问题。

1 个答案:

答案 0 :(得分:2)

尝试禁用MultiViews(Options -MultiViews),在这种情况下通常应该责怪它。

(有关MultiViews做什么的更详细说明,请参阅http://httpd.apache.org/docs/2.2/en/mod/mod_negotiation.html#multiviews。当一个人试图重写的“假”路径段存在时,这通常会干扰重写时具有相同名称[减去扩展名]的文件。 )