我正在使用.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]
答案 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?sometitle
,a-z
,A-Z
,0-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排名较高的网站,那么您应该三思而后行,因为至少在开始时您会发现排名有所下降。