前言:
眼前小伙伴们对“apache重写自定义url”可能比较关切,我们都想要学习一些“apache重写自定义url”的相关知识。那么小编在网摘上搜集了一些对于“apache重写自定义url””的相关知识,希望大家能喜欢,同学们一起来了解一下吧!启用替代并执行URL重写
这个食谱教你如何使用mod_rewrite。 我之前提到过mod_rewrite; 它是Apache的一个模块,允许我们修改URL并将其解析为不同的资源。 人们想要做到这一点有很多原因。 例如,您可能移动了一些文件并更改了其URL,但您不希望其他位置存在的任何链接仍然指向旧目标。 您可以编写与旧位置匹配的重写规则,并动态更新URL以成功满足请求。 另一个例子是SEO; 您可能拥有资源的长而不友好的规范网址,但想要更短,更难忘的内容。 友好的URL可以映射到幕后的规范URL.
准备工作
此配方需要具有有效网络连接的CentOS系统。 它假定系统配置了IP地址192.168.56.100并且正在运行Apache,如前面的配方中所述。 通过使用root帐户登录或使用sudo,还需要管理权限.
怎么做
请按照以下步骤执行URL重写:
使用文本编辑器打开/etc/httpd/conf/httpd.conf文件:
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 ()URL rewriting guide ()URL rewriting for the fearful ()
标签: #apache重写自定义url #apache关闭url重写