0

我正在为网站配置 .htaccess。

我想重写网址

http://www.example.com/search/foo/bar/baz/ ...(任意数量的子目录)

http://www.example.com/forms/index.php?i=foo--bar--baz-- ...

另一种选择是重定向所有网址

http://www.example.com/search/foo/bar/baz/ ...

http://www.example.com/forms/index.php

并让 index.php 解析 uri。

我尝试了以下 mod_rewrite 来实现上面的第二个替代方案

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php

但我收到 404 错误。

注意:不确定是否重要,但这发生在 Wordpress 网站上。整个 .htaccess 是

Options +FollowSymLinks

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

任何帮助,将不胜感激。

谢谢。

编辑1:

我取得了一些进展。我在 RewriteRule 的末尾缺少 [L]。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php [L]

作品。现在我需要在 url 中检查 /search。

编辑2:

更多进展:

RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^search/(.*)$ http://www.example.com/forms/index.php?i=$1 [QSA,L]

它似乎正在工作。将 search/ 之后的所有内容作为参数 i 传递。

现在我想仍然在地址栏中显示原始网址(不是重写的)。有什么办法吗?

谢谢

4

2 回答 2

1

效果
Rewrite ^(.*)$ forms/index.php?i=$1 [QSA,L]
应该有效的东西

这里的重点是^(.*)$选择并捕获任何 url,?i=$1将旧的 url 作为查询字符串。 QSA使旧查询字符串附加在传递其他信息的情况下。你可能需要这个,你可能不需要。

于 2013-10-26T19:39:55.680 回答
1

如果您收到 404 错误,那么您可能没有打开 rewrite 模块,或者根本没有读取 .htaccess 文件。

这似乎不正确:

RewriteRule !^index\.php$ /forms/index.php

重写引擎层次结构是首先找到的规则适用,其他被跳过。所以如果你不想重写 index.php,而是重写所有其他的,你可以简单地做 Wordpress 所做的:

第一行: RewriteRule ^index\.php$ - [L]<- 将 index.php 重写为“nothing”

第二行: RewriteRule .* /index.php [L]<- 将所有内容重写为 index.php

所以当请求是 index.php 时,Apache 的行为是这样的:它检查第一行......“哇!匹配!所以让我们将它重写为空并加载这个文件......文件中的其他规则?哦,好吧......我没时间看!”

当请求不是 index.php 时,Apache 检查第一行......“哦,好吧......不匹配......该死......我必须阅读其他行”。检查第二行......“是的!它匹配!我不需要阅读任何其他内容,phiew!”

于 2013-10-26T19:41:17.313 回答