【问题标题】:rewrite in seo friendly way complex url in htaccess以 seo 友好的方式重写 htaccess 中的复杂 url
【发布时间】:2016-05-02 22:03:38
【问题描述】:

您好,我正在开发一个网站,所有 .php 文件都位于服务器的主文件夹中(.htaccess 所在的位置)。 所以 index.php 和 productDetail.php 在同一个文件夹中。 我想重定向这样的网址:

http://www.mywebsite/productDetail/PRODUCTNAME

http://www.mywebsite/productDetail.php?product=PRODUCTNAME

这样我就可以链接第一个链接版本而不是第二个。

我还需要重定向一个更复杂的版本,比如:

http://www.mywebsite/PRODUCTCATEGORY/PRODUCTSUBCATEGORY/productDetail/PRODUCTNAME

http://www.mywebsite/productDetail.php?product=PRODUCTNAME&category=PRODUCTCATEGORY&subcategory=PRODUCTSUBCATEGORY

我的 .htaccess 目前使用以下规则,我认为这些规则使此操作变得非常困难,因为我已经为此工作了很多时间:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^ /it%{REQUEST_URI} [L,NC,R=301]

RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteRule ^ /en%{REQUEST_URI} [L,NC,R=301]

RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC]

任何帮助将不胜感激。 非常感谢

【问题讨论】:

  • 只有一个主文件夹。即 MAIN,其中包含 index.php 和 productDetail.php 文件。 /it 或 /en 只是为不同浏览器语言更改 URL 的方法
  • 好的,在这种情况下http://www.mywebsite/productDetail/PRODUCTNAME实际上不会是http://www.mywebsite/en/productDetail/PRODUCTNAME
  • @anubhava 是的,这正是我想要实现的目标
  • @anubhava 是的,这正是我想要实现的。此时,我使用 URL mywebsite/en/productDetail?product=PRODUCTNAME 使用它,顺便说一下 productDetail.php 文件与 index.php 文件位于同一文件夹中,并且没有文件夹“en”或“it”。我现在需要使上面的工作 URL 看起来像 mywebsite/en/productDetail/PRODUCTNAME

标签: php apache .htaccess redirect mod-rewrite


【解决方案1】:

试试这些规则:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L]

RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^ /it%{REQUEST_URI} [L,NC,R=301]

RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteRule ^ /en%{REQUEST_URI} [L,NC,R=301]

RewriteRule ^(en)/(productDetail)/([\w-]+)/?$ $2.php?lang=$1&product=$3 [L,QSA,NC]
RewriteRule ^(it)/(dettagliProdotto)/([\w-]+)/?$ $2.php?lang=$1&product=$3 [L,QSA,NC]

RewriteRule ^(en)/([\w-]+)/([\w-]+)/(productDetail)/([\w-]+)/?$ $4.php?lang=$1&product=$5&category=$2&subcategory=$3 [L,QSA,NC]
RewriteRule ^(it)/([\w-]+)/([\w-]+)/(dettagliProdotto)/([\w-]+)/?$ $4.php?lang=$1&product=$5&category=$2&subcategory=$3 [L,QSA,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC]

【讨论】:

  • 感谢 anubhava,你给了我一个很好的建议!现在它可以工作了,我的意思是我能够读取代码中的变量 product 并且 url 没有改变,但是就像代码中的每个链接或外部 ref 现在用作 base_url =mywebsite.com/en/productDetail / ,因此,例如,所有包含和链接都不再起作用。您对如何从 htaccess 修复它有任何想法吗?或者我需要在 html /php 代码中找到解决方案?谢谢
  • 这是由于您使用了相对路径。您可以将其添加到页面 HTML 的 <head> 部分下方:<base href="/" />
  • 我还有一个小问题,不知道你能不能帮帮我。如果我想更改 RewriteRule 中的“productDetail” ^(en|it)/(productDetail)/([\w-]+)/?$ $2.php?lang=$1&product=$3 [L,QSA,NC ] 根据语言?我的意思是在意大利 productDetail 是“dettagliProdotto”
【解决方案2】:

您可以使用以下形式的规则:

RewriteEngine on


RewriteRule ^productdetail/productname/?$ /productdetail.php?productname [NC,L]

正则表达式规则:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/.]+)/?$ /productdetail.php?productname [NC,L]

这将在内部将 /productDetail/foo 重定向到 /productDetail.php?product?foo。

【讨论】:

  • 不幸的是没有做到这一点,看起来它被忽略了:(
  • @pipizanzibar 您能否更详细地说明您遇到的问题?
  • 这就像代码中的所有内容都试图在文件夹 /productdetail/beach 中查找资源,所以每个相对 url 都从这个开始:mystic.com/productdetail/beach,但正如我所写,我把每个文件都放在同一个文件夹中。 index.php 和 productdetail.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多