在 .htaccess 中启用人类可读的 URL
Posted
技术标签:
【中文标题】在 .htaccess 中启用人类可读的 URL【英文标题】:Enable human readable URL's in .htaccess 【发布时间】:2016-01-08 14:15:13 【问题描述】:前言:是的,这个问题似乎重复了,我找到了相关的问题,但那里的答案对我没有帮助。 :(
您好,我想为我的 php 项目添加人类可读的 URL 支持。现在我的 URL 查询字符串看起来像:
index.php?url=main/index
我想让它看起来像:
index.php/main/index
我阅读了以下文章:
***
Cheatsheet
***
***
但是当我这样做时:
var_dump($_GET['url']); // get empty array
,获取空数组,就像没有添加url参数一样。
我现在的.htaccess
:
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ index.php?url=$1 [NC]
有人可以帮帮我吗?谢谢!
【问题讨论】:
URL是否仍然重写但不通过$_GET中的url? 您的 htaccess 是在根文件夹中还是在子文件夹中?此外,您必须添加一个条件以避免循环 【参考方案1】:在行RewriteRule ^(.*)$ index.php?url=$1 [NC]
中,(.*) 匹配 url 直到 '?' 的部分查询开始的位置。
要使用查询中传递的值,您需要 QSA 标志。表示查询字符串追加。
【讨论】:
您好,感谢您的回答,现在行看起来像:RewriteRule ^(.*)$ index.php?url=$1 [NC, QSA]
,但仍然有相同的结果【参考方案2】:
网址:http://domain.com/index.php/controller/action
重写网址:http://domain.com/index.php?url=controller/action
.htaccess
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^index.php/(.*)$ /index.php?url=$1 [L,QSA]
解释:
^index.php/(.*)$
模式中的 .*
匹配传入 URL 上 index.php/
之后的所有内容。括号有助于将部分捕获为变量 $1
,然后将其添加到替换 URL /index.php?url=
+ $1
的末尾。
[L, QSA]
:
L 忽略其他重写规则,如果这合适的话。
QSA 表示查询字符串追加。
【讨论】:
您好,感谢您的回复,但实际上我想要反向转换,从index.php?url=cont/action
到 index.php/cont/action
或者这意味着服务器将获得第二,但我可以像第一种情况一样编写它?
也许我的问题弄错了。不确定。这会将第一个 URL http://domain.com/index.php/controller/action
重写为 http://domain.com/index.php?url=controller/action
- 并且 $_GET['url']
将包含字符串 controller/action
。
是的,你写了,但它不起作用,$_GET 数组仍然是空的。
@excluded if REQUEST_URI output '/project/index.php/test/about' 尝试从 RewriteRule 更改 htaccess ^index.php/(.*)$ /index.php?url=$1 [L,QSA] 改写规则 ^/project/index.php/(.*)$ index.php?url=$1 [L,QSA]【参考方案3】:
你有
index.php?url=main/index
你想重写(然后用户重定向)到这个
index.php/main/index
试试这个怎么样?
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %QUERY_STRING ^url=([a-z]+)/([a-z]+)$
RewriteRule ^.*$ http://mydomain.site/index.php/%1/%2 [R=302,L]
R=301 或 302 取决于您的需要
在此示例中,我假设在原始 url 上只有 a-z 字符。 只是为了澄清(由于通常该过程是相反的)用户将被重定向,此规则不会转换您页面上的链接。
【讨论】:
您好,感谢您的回复,但这对我没有帮助。我在 htaccess 中做这些事情也许我应该转移到虚拟主机配置? 我有一个疑问,网站上的用户看到的是什么类型的链接?【参考方案4】:试试下面的代码,只考虑 index.php 你可以根据你的要求替换它。如果您需要进一步的帮助,请告诉我。
DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine ON
RewriteBase /
RewriteRule ^(index\.php)/([0-9a-zA-Z\/_-]1,99) index.php?url=$2
对我有用的是:-
<?php var_dump($_GET); ?>
这是我在 url http://localhost/baba.php/abcd
上做的唯一事情。和原始 .htaccess 文件
DirectoryIndex baba.php
RewriteEngine ON
RewriteBase /
RewriteRule ^(baba\.php)*/([0-9a-zA-Z\/_-]1,99) baba.php?url=$2
【讨论】:
我在我的本地主机上做了,它工作我为 baba.php 测试了它并为你将它更改为 index.php,好的,我会再试一次并修改我的答案。 该死,仍然无法正常工作,请您筛选一下结果吗?也许我真的做错了什么...... @excluded 你有没有试过更新的或者解决了让我们知道。【参考方案5】:如果您的网址:www.abcd.com/index.php/abcd/...
.htaccess
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
【讨论】:
以上是关于在 .htaccess 中启用人类可读的 URL的主要内容,如果未能解决你的问题,请参考以下文章
人类可读的 JSON:又名在 json 转储中添加空格和中断
将 dict 保存为 JSON,以便它们是人类可读的 [重复]