.htaccess开发,分期和生产之间

时间:2011-07-20 15:14:58

标签: php .htaccess development-environment

我正在开发一个使用网址重写的应用,并且具有特定的.htaccess配置。在使用应用程序时,我有三个要点:

  1. 在我的本地计算机上开发(localhost)
  2. 暂存(staging.mydomain.com)
  3. 生产(www.mydomain.com)
  4. 我不断推动新的升级到登台和制作环境,每次我覆盖现有的源代码时,我都要更改.htaccess文件。有没有办法让.htaccess可以通用到目录或让它自动检测它的环境?

    我当前的.htaccess文件如下。我只是取消评论不同环境之间的部分,但很想停止这样做......

    # Development
    
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !=/favicon.ico
    RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA]
    
    # Staging
    
    # RewriteEngine on
    # RewriteCond %{REQUEST_FILENAME} !-f
    # RewriteCond %{REQUEST_FILENAME} !-d
    # RewriteCond %{REQUEST_URI} !=/favicon.ico
    # RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA]
    
    # Production
    
    # RewriteEngine on
    # RewriteCond %{REQUEST_FILENAME} !-f
    # RewriteCond %{REQUEST_FILENAME} !-d
    # RewriteCond %{REQUEST_URI} !=/favicon.ico
    # RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA]
    

    提前致谢!

4 个答案:

答案 0 :(得分:16)

# Development

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteCond %{HTTP_HOST} ^localhost
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA]

# Staging

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteCond %{HTTP_HOST} ^staging.mydomain.com
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA]

# Production

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteCond %{HTTP_HOST} ^www.mydomain.com
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA]

答案 1 :(得分:9)

一种选择是在httpd.conf(或其他地方)设置定义环境的环境变量。

例如(在httpd.conf中):

SetEnv ENVIRONMENT production

(在.htaccess

RewriteEngine on

# Development
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} != /favicon.ico
RewriteCond %{ENV:ENVIRONMENT} = development
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA]

# Staging
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} != /favicon.ico
RewriteCond %{ENV:ENVIRONMENT} = staging
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA]

# Production
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} != /favicon.ico
RewriteCond %{ENV:ENVIRONMENT} = production
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA]

未经测试,但我认为这个概念足以找出任何问题; - )

答案 2 :(得分:1)

您是否可以将.htaccess文件放在每个环境中,然后在您正在使用的任何FTP或部署程序中忽略该文件?

替代方法,我所做的是在本地主机中设置VirtualHosts,该主机与生产站点属于同一个域,但前缀为dev.。例如,www.example.comdev.example.com。这样,我总能确定root是我正在使用的任何主机的顶级目录,无论环境如何;我不需要重新编写.htaccess指令。

答案 3 :(得分:0)

Chuck D,Dumitru Ceban的变体非常好。但我建议你也尝试选择在代码中加一些标志 - 而不是.htacces。

另外,rudi_visser的好建议。但是我想在这里补充一点,在理想的系统中我们应该只使用apache的* .conf并拒绝.htaccess(只是一个愚蠢的表现)。

所以我建议你在代码中加一些标志,避免使用.htacess(如果可以)并切换env。通过简单的conf值或某些逻辑,如if locaslhost == host then ...