【问题标题】:.htaccess writerule to remove question marks and equal mark.htaccess 重写规则以删除问号和等号
【发布时间】:2014-01-05 19:12:25
【问题描述】:

今天我尝试创建将?= 替换为/ 的.htaccess 文件,
test.php 代码:

<?php
echo $_GET['myparam'];
?>


.ht 访问:
我使用了这个写规则:

RewriteEngine On
RewriteBase /
RewriteRule ^test/myparam/([0-9]+)/?$ test.php?myparam=$1 [NC,QSA,L]

好的,我导航到 www.web.com/test.php?myparam=123
没有重定向到 www.web.com/test/myparam/123
所以导航到:www.web.com/test/myparam/123(手动)并且php脚本工作,
我将 myparam 值更改为 abc 而不是 123:www.web.com/test/myparam/abc
然后它重定向到 404 not found 页面...(服务器不知道 abc 不是目录 when integer works when string 404)


所以我想做什么:


www.web.com/test .php? inttParam = 1 & strrParam = stringhere & p = 1

www.web.com/test/inttParam/1/strrParam/stringhere/p/1


当我使用$_GET['p'] 时,它会起作用。

【问题讨论】:

  • 当然,将 123 更改为 abc 是行不通的——重写匹配数字。如果没有将 URI 更改为“真实”的东西(/test.php 等),它将抱怨找不到 /test/myparam/abc。
  • 你在这方面倒退了。 incoming URI 是/test/myparam/123(SEO),.htaccess 将其转换为/test.php?myparam=123(动态)。如果您输入动态表单,它应该被原封不动地传递,因为它已经在所需的表单中。如果您输入 SEO 表单,它应该以动态形式传递给服务器/PHP。顺便说一句,应该可以为多个术语通用地执行此操作/$1.php?$2=$3&amp;$4=$5&amp;...

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

i changed the myparam value to abc instead of 123 and it didn't work

当然它不会起作用,因为您的规则最终只匹配数字

RewriteRule ^test/myparam/([0-9]+)/?$ test.php?myparam=$1 [NC,QSA,L]

把你的规则改成这个,让它适用于任何东西:

RewriteRule ^test/myparam/([^/]+)/?$ test.php?myparam=$1 [NC,QSA,L]

为了使其基于递归的通用规则将/test/inttParam/1/strrParam/stringhere/p/2 转换为/test.php?p=2&strrParam=stringhere&inttParam=1`:

RewriteRule "^(test)(?:\.php)?/([^/]+)/([^/]*)(/.*)?$" /$1.php$4?$2=$3 [NC,L,QSA]

【讨论】:

  • 你很棒 :-) anubhava
  • 我试过了,但是css和图片没有加载
  • 您可以在页面 HTML 的 &lt;head&gt; 标记下方添加此代码:&lt;base href="/" /&gt;
  • 谢谢它在我的情况下工作我不得不使用&lt;base href="../../" /&gt;
  • RewriteRule "^(test)(?:\.php)?/([^/]+)/([^/]*)(/.*)?$" /$1.php$4?$2=$3 [NC,L,QSA] 在我的情况下不起作用,只有 RewriteRule ^test/myparam/([^/]+)/?$ test.php?myparam=$1 [NC,QSA,L] 起作用。可以修吗
【解决方案2】:
RewriteEngine on

# do not affect files
RewriteCond %{REQUEST_URI} !(\..{2,4})$
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?parameter1=$1&%1 [L]

大概是这样的吧?

【讨论】:

    【解决方案3】:

    好的,我导航到 www.web.com/test.php?myparam=123
    没有重定向到 www.web.com/test/myparam/123

    我不知道这是否意味着您还想将带有 GET 参数的重定向(大概是 301)重定向到带有斜杠的重定向。

    如果是这样,我建议使用来自 anubhava 的先前答案并使用 PHP 处理任何 301 重定向。实际上,您可以使用“R”标志使用“RewriteRule”重定向,但我承认我不知道如何解决这个特殊情况。

    无论如何,我认为没有必要,除非带有 GET 参数的旧 URL 在 SEO 中运行良好并且您不想失去排名。

    【讨论】:

    • "从带有 GET 参数的那个重定向(大概是 301)到带有斜杠的那个。"每个人都会使用正确的术语吗?您的传入 URI(来自野外)是“带斜杠”的 SEO(静态)形式,并且您正在将其 TO 转换为 URL 查询字符串的动态非 SEO 形式(“GET 参数”)。不是反过来。 .htacces 看不到传出 URL。
    • 对不起,术语混乱,但在我的回答中,我谈论的是传入的不友好 URL,假设它们是要通过 301 重定向转换为友好 URL 的永久链接。
    • 说什么?如果传入(来自“wild”)的 URL 是动态的(非 SEO),则不能使用 .htaccess 将其更改为 SEO 格式,因为它将作为 SEO 返回并转换回动态,这可能会造成循环。最终它必须是动态的(非 SEO),以便服务器可以找到正确的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多