可以将这两个.htaccess文件合并吗


Is it possible to combine these two .htaccess files?

我必须完全替换现有的网站。目前的网站完全是spagetti代码,有一些重写规则来模仿友好的url。

目前的体系结构和数据库结构无法解决一些关键任务问题,因此在一段时间内,两个代码库需要共存。

这是当前的.htaccess

Options +FollowSymLinks
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}'.html -f
RewriteRule ^([^/]+)/$ $1.html
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ $1.php?q=$2
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ $1.php?q=$2&r=$3
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ $1.php?q=$2&r=$3&s=$4

我用zend框架站点替换它,但它通过index.php文件为路由路由所有内容

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule .* - [L]
RewriteRule .* index.php

有人知道我如何将两者结合起来,直到原来的可以完全替换吗?

如果你能以某种方式将你的旧Url映射到Zend Url,那就相当容易了。假设你有

http://foo.bar.com/something.php?q=arg1&r=arg2

如果你在Zend代码中有这个功能,那么你也必须有有效的URL,比如

http://foo.bar.com/something/q/arg1/r/arg2

如果是这样的话,你所需要的就是将旧的URL重写为Zend URL,而不是进行内部重定向,而是进行HTTP重定向,即(我不知道,没有测试):

RewriteCond %{QUERY_STRING} ^q=(.*)&r=(.*)^  
RewriteRule ^something'.php$ /something/q/%1/r/%2? [R=301,L]

注意后面的"?",它告诉mod_rewrite不要将原始查询字符串附加到重写的查询字符串(否则将以/something/q/%1/r/%2?q=X&r=y结束。注意,我们在这里进行常规的301 HTTP重定向。

它们不会很容易合并,这取决于你想优先选择哪一个。您可以再添加一些条件,以确保所有内容都不会作为$1.php文件进行路由,然后将zend规则添加到末尾。

Options +FollowSymLinks
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}'.html -f
RewriteRule ^([^/]+)/$ $1.html
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}'.php -f
RewriteRule ^([^/]+)/$ $1.php
RewriteCond %{REQUEST_URI} ^([^/]+)/
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([^/]+)/([^/]+)/$ $1.php?q=$2
RewriteCond %{REQUEST_URI} ^([^/]+)/
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ $1.php?q=$2&r=$3
RewriteCond %{REQUEST_URI} ^([^/]+)/
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ $1.php?q=$2&r=$3&s=$4
# other rules
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule .* - [L]
RewriteRule .* index.php