.htaccess mod重写需要帮助

时间:2014-11-22 18:25:12

标签: php .htaccess mod-rewrite

我写了这段小代码。我对此很新,所以我不确定这一切是否正确。但基本上它让我使用php扩展访问网址。当人们进入网站时,他们会从geo ip页面重定向到正确的语言,如下所示

main.php?lang = uk或nl或en或eu等

现在我也可以像这样使用它

main /?lang = uk或nl或en或eu等

我希望能够删除url中的变量?lang = uk。

我该怎么做?我的.htaccess代码在

之下
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /
DirectorySlash On

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]

# remove trailing slash
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]
RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php]



</IfModule>

非常感谢任何愿意提供帮助的人。

1 个答案:

答案 0 :(得分:0)

RewriteRule的第一个参数确实匹配域名和前缀*之后的任何内容以及任何查询字符串(如果存在)之前。在http://localhost/this/is/my/test?lang=123中,this/is/目录中的.htaccess文件与my/test匹配。要匹配查询字符串,您必须使用%{QUERY_STRING}变量。

如果RewriteRule的第二个参数(重写的网址)不包含查询字符串,它会自动将原始网址的查询字符串附加到新网址。

在下面的代码中,我使用%{THE_REQUEST}。这是用于发出页面请求的字符串。它的形式为GET /my/resource?query=string HTTP/1.1。重写事物时它不会改变,这有助于防止无限循环。

在你的php文件中,确保从cookie而不是get变量读取语言,然后执行以下操作:

#Set cookie for language
RewriteCond %{QUERY_STRING} ^(.*?)&?lang=([^&]+)&?(.*?)$
RewriteRule ^ %{REQUEST_URI}?%1&%3 [CO=lang:%2:127.0.0.1:1:/:0:1,R,L]

#Remove potential prefix or suffix & from query string
RewriteCond %{QUERY_STRING} ^&(.*?)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*?)&$
RewriteRule ^ %{REQUEST_URI}?%1 [R,L]

#External requests with \.php should be without that.
RewriteCond %{THE_REQUEST} \.php
RewriteRule ^(.*)\.php$ $1 [R=301,L]

#Try to load php page if resource does not alreay have an extension
RewriteCond %{REQUEST_URI} !\.[a-z]+$
RewriteRule ^(.*)$ $1.php [L]