准备事情
此配方须要具有有效网络连接的CentOS系统。 它假定系统配置了IP地址192.168.56.100并且正在运行Apache,如前面的配方中所述。 通过利用root帐户登录或利用sudo,还须要管理权限.
请按照以下步骤实行URL重写:

vi /etc/httpd/conf/httpd.conf找到定义文档根目录的各种选项的“目录”部分。 找到其AllowOverrides选项并将值从None更新为All:
<Directory \"大众/var/www/html\"大众> ... AllowOverrides All ... </Directory>
保存变动并关闭文件。
重新启动Apache以使配置更新生效:systemctl restart httpd验证mod_rewrite模块(标识为rewrite_module)是否可用:
httpd -M | grep rewrite在文档根目录中创建名为.htaccess的文件:
vi /var/www/html/.htaccess 在.htaccess文件中,添加RewriteEngine以打开URL重写引擎:
RewriteEngine on添加描述所需重定向的重写规则。 例如,以下规则将没有文件扩展名的所有要求重定向到给定名称的PHP文件:
RewriteRule ^/?([A-Z]+)$ $1.php [NC,L]保存并关闭文件.事情事理
.htaccess文件是位于站点目录构造中的补充配置文件。 配置后,Apache会搜索.htaccess文件并在知足要求的同时在个中运用选项设置。 当然,为每个要求搜索和加载配置值确实会对性能产生轻微影响,但其权衡会增加灵巧性。 例如,无需重新启动做事器即可使.htaccess文件中的配置变动生效。 在共享托管环境中,精明的客户端可以调度做事器对其自己站点的行为,而无需讯问做事器管理员或哀求访问/ etc / httpd中的主配置文件(可能包含敏感配置值)。 纵然是依赖于特定做事器功能的Web运用程序,也可能包含具有必要配置的.htaccess文件,以使其支配更随意马虎.
Apache默认情形下不许可利用.htaccess文件覆盖做事器的配置。 要启用它,我们须要在适当的高下文中更新AllowOverrides选项,然后重新启动做事器。 此配方在适用于Web根目录的部分中进行了变动:
<Directory \"大众/var/www/html\公众> ... AllowOverrides All ... </Directory>把稳
如果您正在利用虚拟主机,请确保将AllowOverrides选项放在站点的配置文件中。
值为None会导致做事器忽略任何.htaccess文件。 除此之外,.httaccess文件中不许可所有选项。 文件中最常见的是重写要求或特定于目录的访问。 可以涌现的那些被分组在不同的种别下,我们可以指定许可被覆盖的选项的种别。 可能的组名如下:
AuthConfig: 这许可覆盖授权选项(AuthUserFile,AuthDBMUserFile等)FileInfo: 这许可覆盖与要求干系的选项(ErrorDocument,Redirect,RewriteRule等)Indexes: 这些许可覆盖与索引干系的选项(DirectoryIndex,IndexOptions等)Limit: 这许可覆盖访问选项(许可,谢绝和订购)All: 这许可覆盖所有选项组由于AllowOverrides适用于目录级别,因此可以许可或谢绝不同目录中的不同覆盖。 例如,可以跨站点禁用覆盖,但是可以为专用目录覆盖授权选项,以便可以指定特定的授权数据库:
<Directory \公众/var/www/html\"大众> AllowOverrides None </Directory> <Directory \"大众/var/www/html/priv\"大众> AllowOverrides AuthConfig </Directory>把稳
纵然您完备掌握Apache,并且出于性能缘故原由希望将所有内容放在主httpd.conf文件中,许可利用FileInfo覆盖重写选项,您可以设置并打消规则故障,而无需在每次变动后重新启动做事器。然后,您可以在确定规则精确后将规则迁移到主配置文件,并关闭覆盖。
rewrite_module将自身注入做事器的要求处理事情流程,并且可以根据我们在规则集中供应的内容,动态变动要求的URL。虽然默认情形下安装了该模块,但我们仍旧须要利用RewriteEngine显式启用URL重写。除此之外,两个最主要的重写选项是RewriteRule和RewriteCond。
RewriteRule选项指定与URL进行比较的正则表达式。如果匹配,则发生给定的更换。可以在更换中利用诸如$ 1的位置变量来引用捕获的模式匹配。在我们的配方中,规则匹配路径(例如/ about或/ contactus)并重写它以将用户勾引到同名的PHP脚本(about.php或contact.php),从而隐蔽了我们的事实重新利用我们用户的PHP:
RewriteRule ^/?([A-Z]+)$ $1.php [NC,L]
我们还可以供应影响要求返回办法的标志。例如,NC标志不敏感地实行模式匹配情形。 L标志停滞引擎并返回URL而不进行任何进一步的规则处理。同样常见的是R,它逼迫重定向(常日给出HTTP状态代码,例如R = 301),以及QSA,它将查询字符串从原始URL附加到新URL。
RewriteCond选项供应了在评估RewriteRule之前必须通过的条件。条件是正则表达式匹配,变量和测试运算符的稠浊。我们可以利用分外变量来引用URL的各个部分,例如主机名(%{HTTP_HOST}),要求的文件(%{REQUEST_FILENAME})和查询字符串(%{QUERY_STRING}),或者有关的详细信息环境/要求,例如cookie(%{HTTP_COOKIE})和用户代理字符串(%{HTTP_USER_AGENT})。 -d运算符测试路径是否是目录,-f测试路径是否是文件,以及!
否定比赛。 RewriteCond还可以接管少量标志,例如NC标志,以进行比较而不考虑区分大小写,并且OR标志可以在一个或多个关系中加入多个选项(多个选项被隐式地视为和)。
利用RewriteCond和RewriteRule的一种非常常见的重写是在要求与现有文件或目录不匹配时将用户定向到主index.php文件的重写。这常日用于通过中心掌握点路由所有要求的Web运用程序:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.) index.php [L,QSA]
第一个RewriteCond选项检讨要求是否针对现有文件,第二个针对现有目录检讨该要求。如果要求既不是文件也不是目录,则RewriteRule选项将要求映射到index.php。包含可能存在的任何查询字符串,并将其标记为末了一个操作,因此不会实行进一步的重写。
很多人开玩笑地称重写为黑邪术。事实上,令人印象深刻的是mod_rewrite是多么强大以及它如何转换要求,当你无法找到得当的咒语来使你的规则按需事情时,它会令人沮丧。在这种情形下,您可能希望打开日志记录以深入理解引擎如何查看要求。要启用日志记录,请利用RewriteLog选项指定可以写入的日志文件,并利用RewriteLogLevel指定详细程度。常日,RewriteLogLevel的值为5就足够了。它们可以添加到您的.htaccess文件中,并在您确信规则精确后删除:
RewriteLog /var/log/httpd/rewrite_log RewriteLogLevel 5See also
Refer to the following resources for more information on rewriting URLs:
Apache mod_rewrite documentation (http://httpd.apache.org/docs/current/mod/mod_rewrite.html)URL rewriting guide (http://httpd.apache.org/docs/2.0/misc/rewriteguide.html)URL rewriting for the fearful (https://24ways.org/2013/url-rewriting-for-the-fearful)