我在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}&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}&two={R:2}&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}&two={R:2}&three={R:3}&four={R:4}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
谢谢你们!
答案 0 :(得分:0)
如果你想做SEO友好的网址,我建议开发一个路由组件,下一步该如何做到这一点。
您应该使用此重写配置
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
重写规则中有一些标志
现在,除真实文件外的所有请求都会重定向到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路由。