【问题标题】:flexibility in .htaccess for mod_rewrite rulesmod_rewrite 规则的 .htaccess 灵活性
【发布时间】:2013-05-14 08:01:45
【问题描述】:

我想将我的旧 php 文件重定向到新的 seo 友好文件:

user.php?user=$var1&task=$var2 -> url/$var1/$var2

有两个问题。 $var2 不是每次都设置,所以我不知道如何处理,并且查询字符串总是在最后添加。

我使用以下重定向规则进行测试(不带 $var2)

RewriteCond %{THE_REQUEST} ^(.+)user\.php(.+)$
RewriteCond %{QUERY_STRING} user=([^/]+)$
RewriteRule ^(.+)\.php$ %1 [R]

我明白了:

    url/$var1/?user=$var1

第二个问题是重写规则使得 url/$var1 -> user.php?user=$var1 没有它,我会收到服务器错误。

在我尝试这个静态测试的那一刻,但这不是唯一的规则,所以这里的条件是错误的

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ user.php?user=$1 [L]

如何通过变量获得正确的结果和更大的灵活性? mod_rewrite 目前不是我的世界,所以我希望你能在黑暗中带来光明。

谢谢鲁文

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    1) 防止查询字符串末尾的方法是添加一个?在您重写的 URL 的末尾。

    RewriteCond %{THE_REQUEST} ^GET\ /user\.php
    RewriteCond %{QUERY_STRING} user=([^&=]+)$
    RewriteRule ^user\.php %1? [R]
    

    如果 var1 和 var2 都被设置了,它会是

    RewriteCond %{THE_REQUEST} ^GET\ /user\.php
    RewriteCond %{QUERY_STRING} user=([^&=]+)$
    RewriteCond %{QUERY_STRING} task=([^&=]+)$    
    RewriteRule ^user\.php %1/%2? [R]
    

    结合这些(首先是第二个),它应该根据需要重定向

    2) 由于这是一种“包罗万象”的 URL,因此您应该将其作为 .htaccess 中的最后一个选项,并将不是文件或目录的 everything 重定向到 user.php然后让 user.php 判断用户是否存在,如果不响应则返回 HTTP 404。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)$ user.php?user=$1 [L]
    

    (我删除了末尾的 /,因为对于完全相同的内容有两个 URL 不是一个好主意)。

    【讨论】:

    • 啊,这更好,但是当我想将它用于所有 .php 而不是仅 user.php 并且查询很灵活,因此不仅仅是用户和任务时,我该怎么办。这可能吗?目前我没有得到解决方案。
    • 恐怕你不能真正做到通用。您必须在 .htaccess 中列出所有它们及其特定参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2015-07-27
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多