我想要实现的目标:
1)http://localhost/en/script.php?param1=random映射到http://localhost/script.php?param1=random&language=English
2)http://localhost/en/random/text/here将映射到http://localhost/categories.php?term=random/text/here
我现在所拥有的:
RewriteEngine on
RewriteCond substr(%{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^en/(.+)$ categories.php?lang=English&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ee/(.+)$ categories.php?lang=Estonian&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^fi/(.+)$ categories.php?lang=Finnish&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ru/(.+)$ categories.php?lang=Russian&terms=$1 [L]
RewriteRule ^en/(.*) $1?lang=English [QSA]
RewriteRule ^ee/(.*) $1?lang=Estonian [QSA]
RewriteRule ^ru/(.*) $1?lang=Russian [QSA]
RewriteRule ^fi/(.*) $1?lang=Finnish [QSA]
问题是什么:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
它应该重定向到categories.php?lang =英文IF / en / this / here / does / not / match / a / script。如果我加载像en / index.php这样的URL,它也会映射到categories.php?lang = English,因为en / index.php不存在。
我的想法:
substr(%{REQUEST_FILENAME},3)将解决我的问题(因为目前/ee/index.php实际上映射到/ee/index.php而不仅仅是/index.php)
不幸的是我找不到操纵字符串的方法:/
答案 0 :(得分:1)
我认为语言代码是使URL映射到不存在的文件的原因。切换这两个步骤,首先将语言代码移动到查询字符串。这还具有将关键字步骤简化为单个RewriteRule的额外优势,因为它们不再需要同时执行两项操作。
RewriteRule ^en/(.*) $1?lang=English [QSA,DPI]
RewriteRule ^ee/(.*) $1?lang=Estonian [QSA,DPI]
RewriteRule ^ru/(.*) $1?lang=Russian [QSA,DPI]
RewriteRule ^fi/(.*) $1?lang=Finnish [QSA,DPI]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ categories.php?terms=$1 [L,QSA]
答案 1 :(得分:0)
对于substr问题,您可以尝试absolute paths
:
RewriteRule ^en/(.*) /$1?lang=English&%{QUERY_STRING}
或
RewriteRule ^en/(.*) http:/localhost/$1?lang=English&%{QUERY_STRING}
另外,我可能会挑剔,但如果你在PHP基础上使用语言代码,404'不存在的语言并使用
进行语言评估,那会不会更容易RewriteRule ^(.*?)/(.*) $2?lang=$1&%{QUERY_STRING}
编辑:取决于您拥有的脚本数量,您不能执行以下操作:
RewriteRule ^(。*?)/(script.php | other.php)$ 2?lang = $ 1 [QSA]
=有管道列表文件,可以访问吗?
答案 2 :(得分:0)
也
%{QUERY_STRING}
不是必需的,添加QSA,您将获得添加到网址末尾的所有参数
尝试做:
RewriteRule ^en/(.*) $1?lang=English [QSA]