Cra*_*erb 5 .htaccess mod-rewrite
我已经看过这些解决方案,但实际上我们都没有正常工作:
如何使用Apache Mod_rewrite删除php扩展,同时保留GET参数?
他们只是不做以下事情,这就是我需要做的事情:
1)从文件中删除.php扩展名,而不是/index.php显示/索引
2)保留GET参数(我在文件加载时读取并存储在会话cookie中,在标题中),所以代替/index.php?a=1&b=2显示可能/ index/a1/b2
3)在子域和https://上工作而不会完全搞乱URL或最终陷入无限循环或某事......
有没有人知道如何整理这些规则,以便正确覆盖上述3点?
这就是我正在努力的起点:
RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1)
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]
Run Code Online (Sandbox Code Playgroud)
你看到这是错误的方式.您不希望将.php文件的请求重定向到干净的地址,因为您从不希望用户首先看到.php.相反,您需要接受一个不以.php结尾的请求,然后检查该文件(在表面下)是否实际上具有.php扩展名.然后,如果是这种情况,请静默重写添加.php扩展名的请求,以便用户永远不需要查看扩展名.
请尝试以下方法:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /$1.php [QSA]
Run Code Online (Sandbox Code Playgroud)
一旦将".php"添加到它的末尾,RewriteCond将检查请求(添加到DOCUMENT_ROOT路径的末尾)是否形成有效的文件名.如果是这样,则允许RewriteRule以静默方式重写请求,以便将".php"添加到请求路径中.QSA标志告诉mod_rewrite将现有查询字符串附加到新请求路径的末尾,因此应保留您的GET变量.
请注意,DOCUMENT_ROOT可能已经或可能没有尾随斜杠,因此您可能需要$1在RewriteCond 之前删除斜杠.
对于查询字符串参数,mod_rewrite无法处理无限数量的变量,因此在mod_rewrite解决方案提供将其映射到查询字符串的方法之前,您需要在问题中提供显式请求模式.
| 归档时间: |
|
| 查看次数: |
6620 次 |
| 最近记录: |