用于启用 mod_rewrite AllowOverride All 的 Bash 脚本

Gra*_*avy 3 linux apache bash mod-rewrite

我正在远离 AMPPS / MAMP,并希望构建一个尽可能接近生产环境的开发环境。

因此,我在安装了 CentOS 6.4 64 位操作系统的 Mac 上使用 Vagrant / VirtualBox。

在我的流浪文件中,我有一个配置脚本:

config.vm.provision :shell, :path => "bootstrap.sh"
Run Code Online (Sandbox Code Playgroud)

目前,我的 bootstrap.sh 如下所示:

#!/usr/bin/env bash

# Install the remi repos
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# Update the repositories
sudo yum -y update

sudo yum -y --enablerepo=remi,remi-php55 install php-pecl-apc php-cli php-pear php-pdo php-mysqlnd php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml
Run Code Online (Sandbox Code Playgroud)

现在我已经安装了我的 apache 服务器,我希望我的 bash 脚本编辑/etc/httpd/conf/httpd.conf文件并更改AllowOverride NoneAllowOverride All我的 html 目录中。

<Directory "/var/www/html">

...

    Options Indexes FollowSymLinks

...

    # Need to change this to AllowOverride All via bash script
    AllowOverride None

...

    Order allow,deny
    Allow from all

</Directory>
Run Code Online (Sandbox Code Playgroud)

Ger*_*ais 8

使用 Linux SED 命令搜索和替换两个模式之间的行

另一个不错的解决方案是使用 SED 命令来搜索和替换两个模式之间的行。在您的情况下,模式将是:

'<Directory "/var/www/html">' and </directory>'
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您只替换 html 目录(<Directory "/var/www/html">)中的“AllowOverride None”行,而不是 httpd.conf 文件中包含“AllowOverride None”的每一行。

SED 命令支持以下形式的模式范围:

sed '/startpattern/,/endpattern/ <sed-commands>' file
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这变成:

sed -i '/<Directory "\/var\/www\/html">/,/<\/Directory>/ s/AllowOverride None/AllowOverride all/' /etc/httpd/conf/httpd.conf
Run Code Online (Sandbox Code Playgroud)

-i 选项用于就地编辑文件。如果您不使用选项 -i,那么修改后的输出将打印在屏幕上并且文件不会被修改!

  • 这正是我一直在寻找的! (2认同)
  • 我的情况(apache 2.4)你不需要引号 `sed -i '/&lt;Directory \/var\/www\/&gt;/,/&lt;\/Directory&gt;/ s/AllowOverride None/AllowOverride All/' /等/apache2/apache2.conf` (2认同)