提问者:小点点

Apache两个重写规则依赖项


我有一个电子商务网站,我想让它多语言。到目前为止,英语已经被用作一种高级语言。下一个网址的工作正在进行,并被谷歌索引。

* example.com/article/id-item

由于我需要使其具有多语言性,因此url需要采用以下方式:

* example.com/en/article/id-item -> which is language default
* example.com/fr/article/id-item
* example.com/de/article/id-item

因为我不想受到谷歌的惩罚,因为我现在的url是非常好的索引,而不是使用http://example.com/en/article/id-item我想使用英语语言的当前URL,因此我的URL应为:

* example.com/article/id-item -> English
* example.com/fr/article/id-item -> French
* example.com/de/article/id-item -> German

但在内部,要正确路由Symfony,我需要这些内部重定向(在浏览器地址框中看不到):

* example.com/index.php/en/article/id-item -> English
* example.com/index.php/fr/article/id-item -> French
* example.com/index.php/de/article/id-item -> German

所以我一直在测试我的电脑。htaccess,但它无法正常工作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^index\.php
RewriteRule ^(.*)$ index.php/$1 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^index\.php/(en|fr|de)
RewriteRule ^index\.php(/?.*)$ en/$1 [L]

这可以测试:http://htaccess.mwl.be/使用urlexample.com/article/id-item作为示例

结果是:输出url

实例com/index。php/article/id项目调试信息

1重写cond%{REQUEST_FILENAME}-f满足此条件。

2 ReWriteCond%{REQUEST_FILENAME}!-d满足此条件。

3重写Cond%{REQUEST_URI}!^index.php满足了这个条件。

4重写规则 ^(.*)$ index.php/1美元新网址example.com/index.php/article/id-item

5重写cond%{REQUEST_FILENAME}-f满足此条件。

6重写cond%{REQUEST_URI}^索引。php/(en | fr | de)不满足此条件。

7重写规则^索引。php(/?*)$en/$1[L]未满足此规则。

我不明白为什么在规则6中,请求URI不是规则4的结果。

有人知道会发生什么吗?


共1个答案

匿名用户

有了这段代码,我想我已经完成了重写:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/?(en|fr|de)
RewriteCond %{REQUEST_URI} !^/?index\.php
RewriteRule ^(.*)$ en/$1 [QSA,L,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/?index\.php
RewriteRule ^(.*)$ "index.php/$1" [QSA,L]

但主要的问题在于Symfony/HttpFoundation请求对象中,原因如下:https://github.com/symfony/symfony/pull/15354