是否可以组合这两个.htaccess文件?

时间:2012-09-03 22:57:52

标签: php .htaccess zend-framework url-rewriting

我必须完全取代现有网站。当前站点是完全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

有没有人知道如何将两者结合起来,直到完全取代原作?

2 个答案:

答案 0 :(得分:1)

如果您可以将旧网址映射到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 :(得分:0)

他们不会很容易合并,这是你想要优先考虑的问题。您可以添加一些条件以确保所有内容都不会作为$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
相关问题