【问题标题】:mod_rewrite .htaccess with %20 translate to -带有 %20 的 mod_rewrite .htaccess 转换为 -
【发布时间】:2013-06-24 15:58:54
【问题描述】:

我已经阅读 .htaccess 文件几个小时了,我想我已经开始明白了,但我仍然需要一些帮助。我找到了variousanswersaround SO,但仍然不确定如何执行此操作。

据我了解,您为要“美化”的每个页面扩展编写了一条规则,因此,如果您有 something.phpanotherpage.phpthispage.php 等,并且他们期待(将收到??)参数,每个人都需要自己的规则。这是正确的吗?

我要更改的网站有这样的网址,

maindomain.com/sue.php?r=word1%20word2

至少有一页有两个参数

maindomain.com/kevin.php?r=place%20name&c=person%20name

所以我想做的是

maindomain.com/sue/word1-word2/
maindomain.com/kevin/place-name/person-name/

保留此 .php 页面并使其看起来像目录。我读过的大多数教程都涉及如何删除传递参数的 .php 页面。但我想保留它。

我预见到的问题是url的所有.php?r=部分都是相同的,即sue.php?r=kevin.php?r=,并且.htaccess根据文件名决定要更改哪个URL,然后省略它。如果我想保留文件名,我必须更改?r= 所以它是个人的?我希望这是有道理的。到目前为止,我有这个,但我确定它不会工作。

Options +FollowSymLinks

RewriteEngine On

RewriteRule ^([a-zA-Z0-9]+)/$1.php?r=$1
RewriteRule ^([a-zA-Z0-9]+)/$1.php?r=$1&c=$1

而且我认为我必须以某种方式或某种方式添加([^-]*),以便它检测到URL 的%20 部分,但是如何将其转换为-。另外,我的$_GET 函数如何工作??

我希望我的问题有意义

【问题讨论】:

    标签: .htaccess mod-rewrite friendly-url


    【解决方案1】:

    您在这些规则中的某处遗漏了一个空格,但我认为您制定 2 条单独规则的想法是正确的。更难的问题是将所有- 转换为空格。让我们从转换为 GET 变量开始:

    # check that the "sue.php" actually exists:
    RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9]+)/([^/]+)/?$
    RewriteCond %{DOCUMENT_ROOT}/%1.php -f
    RewriteRule ^([a-zA-Z0-9]+)/([^/]+)/?$ /$1.php?r=$2 [L,QSA]
    
    RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9]+)/([^/]+)/([^/]+)/?$
    RewriteCond %{DOCUMENT_ROOT}/%1.php -f
    RewriteRule ^([a-zA-Z0-9]+)/([^/]+)/([^/]+)/?$ /$1.php?r=$2&c=$3 [L,QSA]
    

    这些将采用类似于 /sue/blah/ 的 URI 和:

    1. 提取sue 部分
    2. 检查/document_root/sue.php 确实存在
    3. /sue/blah/ 重写为/sue.php?r=blah

    同样适用于 2 字 URI

    类似/kevin/foo/bar/:

    1. 提取kevin 部分
    2. 检查/document_root/kevin.php 确实存在 3 将/kevin/foo/bar/ 重写为/kevin.php?r=foo&c=bar

    现在,去掉“-”并将它们改为空格:

    RewriteCond %{QUERY_STRING} ^(.*)(c|r)=([^&]+)-(.*)$
    RewriteRule ^(.*)$ /$1?%1%2=%3\ %4 [L]
    

    这看起来有点乱,但条件匹配查询字符串,在查询字符串中查找c=r=,在c=r= 的值中匹配-,然后重写查询字符串以将- 替换为(注意空格被编码为%20)。这将删除 GET 参数 cr 的值中的所有 - 实例,并用空格替换它们。

    【讨论】:

    • 这太复杂了。谢谢你这么详细的解释。我要看看我是否可以先在 MAMP 上使用它
    • 这在我的测试服务器上不起作用,MAMP 也不知道为什么。会不会是文件在子目录中?服务器上不允许的选项。
    • @AdamBrown 如果您的实际 URL 看起来像 http://domain/some-dir/sue/word1/word2,那么是的,/some-dir 会破坏一切。答案是基于一切都在文档根目录中的假设,就像它写在你的问题中一样。
    • 那只是测试服务器。我将不得不冒险。再次感谢
    猜你喜欢
    • 2013-02-02
    • 2021-11-26
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2016-12-13
    • 2018-07-16
    • 2016-07-14
    • 2012-05-28
    相关资源
    最近更新 更多