【问题标题】:Is it possible to combine these two .htaccess files?是否可以合并这两个 .htaccess 文件?
【发布时间】:2013-12-21 15:44:51
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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 重定向。

    【讨论】:

    • 嗯,最初只有一些页面会通过 Zend 框架进行路由,只是现在必须修复的部分。所以我会说 95% 的网站需要是原始的,而最初只有 5% 将是 zend 框架的一部分。
    • 您最初的重写规则是通用的,以实现这一点。你不能在你的规则中“抓住所有”,因为 Zend 也在这样做。根据您获得的链接数量,您可能需要更明确地编写重写规则(如果有模式或目标数量有限,那么您甚至可以编写小脚本来生成规则)
    • 如果我通过 zend 路由所有内容,如果我没有找到路由告诉它使用 php 查找旧文件并注意 .htaccess 规则怎么办?
    • 这将要求您编写自己的 ErrorController 来解决这个问题。评估什么对你更好
    • 我想我明白它在做什么。我会试一试。
    【解决方案2】:

    它们不会很容易合并,这是您希望哪个优先的问题。您可以添加更多条件以确保不会将所有内容路由为 $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
    

    【讨论】:

    • 我认为从长远来看,最好通过 Zend 路由所有内容,并在我的 ErrorController 中重新路由任何 404 错误。能帮我把第一组转换规则转成php吗?我不是很明白。
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多