【问题标题】:mod_rewrite so that first-level subdirectory is a GET variablemod_rewrite 使得第一级子目录是一个 GET 变量
【发布时间】:2012-08-23 11:24:51
【问题描述】:

好吧,标题真的很草率。

这是我的问题:我有一个新闻站点,当您转到主页 (domain.com) 时,它会在确定您的地理位置后将您重定向到 domain.com/news/top?geography=San_Francisco

如何使用 .htaccess 以使其来自 domain.com/news/top?geography=San_Francisco domain.com/San_Francisco/news/top

有一些类似的问题,但我没有找到一个足够相似的问题,因为您正在将 URL 编辑为更靠后的子目录。

还应该注意的是,我正在使用 PHP 的 Code Igniter 框架,它通常具有 domain.com/index.php/news/top?geography=San_Francisco 但我已经做了一个 mod_rewrite 以摆脱 index.php。代码如下:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

我试过的代码:

RewriteRule ^([^/]+)/news/top$ /news/top?geography=$1 [L,QSA]
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

【问题讨论】:

    标签: .htaccess codeigniter mod-rewrite url-rewriting


    【解决方案1】:

    在您拥有的 index.php 规则之前,尝试添加:

    RewriteRule ^([^/]+)/news/top$ /news/top?geography=$1 [L,QSA]
    

    不过,您需要确保生成的链接格式为 domain.com/San_Francisco/news/top


    但是要处理仍然看起来像旧方式的野外链接,您必须匹配实际请求:

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /news/top\?geography=([^&]+)
    RewriteRule ^news/top$ /%1/news/top? [L,R=301]
    

    如果有人转到链接domain.com/news/top?geography=San_Francisco 并使其浏览器的地址栏显示为:domain.com/San_Francisco/news/top,这将 301 重定向浏览器。此时,浏览器将发送另一个对第二个 URL 的请求,然后您使用上面的规则将其更改回带有查询字符串的那个。

    【讨论】:

    • 我现在收到的问题是 CodeIgniter 现在认为,由于其功能,LA 实际上是一个控制器,它说控制器 (San_Francisco) 不存在。根据我对这些东西的了解(很少),有没有办法查看 URL 中是否有 /news/,如果有,然后将 GET 变量放在 /news/ 之前?现在,这可能是完全错误的,因为我只讨论了一个小时,但不可能是这样的:code: RewriteRule ^(.*)$/news/([a-zA -Z0-9_]+)$ /news/([a-zA-Z0-9_]+)?geography=$1 [L,QSA]
    • @user1390561 您是否要生成看起来像domain.com/San_Francisco/news/top 的链接?你似乎在要求相反的方式。 我想把这个 URL 变成这个 URL 的概念真的是零意义,因为你不能在野外神奇地改变 URL。
    • 是的,所以我尝试获取 domain.com/news/top?geography=San_Francisco 的 URL 并将其转换为 domain.com/San_Francisco/news/top。如果这不可能(除了极度尴尬之外),我假设至少有可能将其变成 domain.com/news/top/san_francisco?
    • @user1390561 这没什么好尴尬的,这不是什么简单的概念化,the top part of my answer here tries to explain some of it。我已经编辑了我的答案以说明浏览器部分。
    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多