在 .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/actionindex.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的主要内容,如果未能解决你的问题,请参考以下文章

人类可读的 GUID

人类可读的 JSON:又名在 json 转储中添加空格和中断

将 dict 保存为 JSON,以便它们是人类可读的 [重复]

以人类可读的形式在 QSettings 中保存自定义 QMap 模板实例化

如何以人类可读的格式输出(到日志)多级数组?

C++ IP 地址人类可读的形式