SEO友好的URL重写和文件夹

时间:2016-07-18 15:10:05

标签: apache iis url-rewriting

我在Winwdows IIS和Linux Apache上使用URL重写来获得更好看的URL。 URL重写本身工作正常,但如果我想访问该域或重写URL-s的文件夹中的某些文件夹,web-server也会重写文件夹名称并将请求发送到我引用的php文件。

例如,如果我有mydomain.com/somesite/about,它将变为mydomain.com/somesite/index.php?one=about。但是如果我想在mydomain.com/somesite/somefolder上访问名为“somefolder”(实际存在)的文件夹,那么唯一的方法是引用该文件夹中的确切文件(mydomain.com/somesite/somefolder/index .php),因为否则它会被重写为mydomain.com/somesite/index.php?one=somefolder

有人可以给我一个例子,说明如何重写URL以及访问文件夹而不参考特定文件。

这是我的Apache .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine on
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
Rewriterule ^([\w\-]+)/?$ index.php?one=$1
Rewriterule ^([\w\-]+)/([\w\-]+)/?$ index.php?one=$1&two=$2
Rewriterule ^(\w+)/(\w+)/(\w+)/?$ index.php?one=$1&two=$2&three=$3
Rewriterule ^(\w+)/(\w+)/(\w+)/(\w+)/?$ index.php?one=$1&two=$2&three=$3&four=$4 
</IfModule>

这是我的IIS web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="one" enabled="true">
                    <match url="^(\w+)/?$" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <action type="Rewrite" url="/somesite/index.php?one={R:1}" />
                </rule>
                <rule name="two" enabled="true">
                    <match url="^(\w+)/(\w+)/?$" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <action type="Rewrite" url="/somesite/index.php?one={R:1}&amp;two={R:2}" />
                </rule>
                <rule name="three" enabled="true">
                    <match url="^(\w+)/(\w+)/(\w+)/?$" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <action type="Rewrite" url="/somesite/index.php?one={R:1}&amp;two={R:2}&amp;three={R:3}" />
                </rule>
                <rule name="four" enabled="true">
                    <match url="^(\w+)/(\w+)/(\w+)/(\w+)/?$" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <action type="Rewrite" url="/somesite/index.php?one={R:1}&amp;two={R:2}&amp;three={R:3}&amp;four={R:4}" />
                </rule>
				
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

谢谢你们!

1 个答案:

答案 0 :(得分:0)

如果你想做SEO友好的网址,我建议开发一个路由组件,下一步该如何做到这一点。

Apache配置

您应该使用此重写配置

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [QSA,L]
RewriteRule ^(.*)$ /index.php [QSA,L]

我逐步解释这一行

RewriteCond %{REQUEST_FILENAME} -f condition:与文档根目录

中的现有常规文件匹配的所有请求

RewriteRule .* - [QSA,L]短划线表示不应执行替换,现有路径。* 会通过未触及的

传递

这个rewriteRule就在rewriteCond之后,所以rewriteCond只适用于这个重写规则

最后但并非最不重要: RewriteRule ^(.*)$ /index.php [QSA,L]将与先前重写规则不匹配的所有请求重定向到文件index.php

重写规则中有一些标志

  • [QSA] :将原始请求网址中的任何查询字符串追加到重写目标中创建的任何查询字符串
  • [L] :立即停止重写过程,不再应用任何规则

PHP

现在,除真实文件外的所有请求都会重定向到index.php

在您的文件index.php中,您可以添加此代码

<?php
var_dump($_SERVER);
var_dump($_GET);

测试

是时候测试了,如果配置得好,你可以试试像

这样的请求
  • http://example.com/somesite/somefolder
  • http://example.com/somesite/anotherfolder?param=value

您应该看到$ _SERVER和$ _GET的var_dump 如果你想开发一个简单的路由器,你可以使用$ _SERVER ['REQUEST_URI]

这只是一个非常非常简单的路由器,例如

<?php

$rawRoute = explode('/',$_SERVER['REQUEST_URI']);


switch($rawRoute[1]){
        case 'blog':    echo "this is blog page";
                        break;
        case 'forum':   echo "this is forum page";
                        break;
        default:        echo "no route matches, redirect to 404";
                        break;


}

您可以查看此存储库https://github.com/dannyvankooten/PHP-Router以了解如何使用路由器,如果您更加鲁莽,可以查看symfony路由。

相关问题