1

我必须完全替换现有的网站。当前站点完全是意大利面条代码,带有一些重写规则以模仿友好的 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

有谁知道如何将两者结合起来,直到可以完全替换原件?

4

2 回答 2

1

如果您可以以某种方式将旧 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 重定向。

于 2012-09-03T23:11:59.837 回答
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
于 2012-09-03T23:28:31.700 回答