通过删除参数问号

时间:2018-12-03 04:40:32

标签: .htaccess mod-rewrite

我正在使用.htaccess重定向域的某些子文件夹,以删除问号以改善我的URL。

目前我的网址是这样的:

www.example.com/post/?sometitle

我正在尝试删除问号,所以它是以下URL:

www.example.com/post/sometitle

目前,我的.htaccess文件中包含以下代码:

RewriteCond %{THE_REQUEST} /post/?([^\s&]+) [NC]
RewriteRule ^ /post/%1 [R=302,L,NE]

2 个答案:

答案 0 :(得分:0)

如果仅需要从查询中更改,请尝试以下操作,我们将使用QSD标志在匹配规则后丢弃查询字符串。

RewriteCond %{QUERY_STRING} ([^\s&]+) [NC]
RewriteRule ^ /post/%1 [R=302,L,NE,QSD]

答案 1 :(得分:0)

  

我正在使用php GET参数,我试图在浏览器访问example.com/post/sometitle时显示当前example.com/post/?sometitle的页面

在这种情况下,您需要与所问的问题相反:您需要内部重写(而不是外部“重定向”)来自{ {1}}至example.com/post/sometitle

但是,您必须已经更改了应用程序中的所有URL才能使用新的URL格式(没有查询字符串)。您不应该单独使用example.com/post/?sometitle

我还假设.htaccess是一个物理目录,并且您实际上在该目录中服务/post(mod_dir向该文件发出内部子请求)。因此,它实际上是index.php而不是/post/?sometitle

例如:

/post/index.php?sometitle

因此,现在,当您请求RewriteEngine On # Rewrite /post/sometitle to filesystem path RewriteRule ^post/([\w-]+)$ /post/index.php?$1 [L] 时,请求将由/post/sometitle内部重写和处理。

我假设“ sometitle”可以包含/post/index.php?sometitlea-zA-Z0-9_中的1个或多个字符。因此,正则表达式-

如果这是一个新站点,则可以在那里停下来。但是,如果您要更改现有的URL结构,该结构已被搜索引擎索引并已由外部第三方链接,则您需要将旧的URL 重定向。 (重申一下,您必须已经更改了应用程序中的URL,否则用户在浏览您的网站时会遇到反复的重定向。)

要实现重定向,您可以在上述重写之前的 之前添加以下内容:

[\w-]+

检查# Redirect any "stray" requests to the old URL RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{QUERY_STRING} ([\w-]+) RewriteRule ^post/$ /post/%1 [R=302,NE,QSD,L] 环境变量是为了确保我们仅重定向“直接请求”,从而避免重定向循环。

(仅在测试为OK时更改为301,以避免缓存问题。)

摘要:

REDIRECT_STATUS

更新:如果您有多个都遵循相同模式的URL(“文件夹”),例如RewriteEngine On # Redirect any "stray" requests to the old URL RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{QUERY_STRING} ([\w-]+) RewriteRule ^post/$ /post/%1 [R=302,NE,QSD,L] # Rewrite /post/sometitle to filesystem path RewriteRule ^post/([\w-]+)$ /post/index.php?$1 [L] /post/<title>/home/<title>,则您可以修改以上内容以满足所有三个方面的要求,例如:

/build/<title>

旁边:(戴上我的Webmasters帽子...)这实际上并不是对URL结构的“改进”。如果这是一个建立了很多反向链接且SE排名较高的网站,那么您应该三思而后行,因为至少在开始时您会发现排名有所下降。