Mod_rewrite - 创建干净的URL

时间:2013-04-11 15:33:18

标签: php apache mod-rewrite

我们希望为我们的网站创建干净的网址。我搜索过如何做到这一点,我找到了一个代码片段,但它不符合我的要求。在这里,我将解释我们基本上想要的东西。

这是基本网站的网址: http://www.test.com

我们有一个“页面”菜单,其中列出了用户可以看到的特定页面。它看起来如下所示: http://www.test.com/pages.php

我们基本上希望当有人访问 /pages.php 时,应将其重定向到 / pages (或使用完整网址: test.com/pages )或不重定向,只显示找不到的页面。

它也适用于任何这些可能的配置:

  • /页
  • /页/
  • /page.php

我看过Stackowerflow的系统,它的工作方式与我们实际需要的方式相同。所以每次我都在看:

  • stackoverflow.com/questions
  • stackoverflow.com/questions /
  • stackoverflow.com/questions.php - 显示找不到网页的网页

这基本上就是我需要的。我尝试过这段代码,但它并不能完全满足我的需求:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ /$1.php [L,QSA]

如果有人能写清楚解释如何实现这一目标,我会很高兴。此外,如果你发现这个帖子重复,请链接我的确切帖子,因为我一直在搜索这个确切的问题,但我没有找到任何答案。

由于

3 个答案:

答案 0 :(得分:0)

下面,第一条规则将301重定向到没有.php的URL。第二条规则将通过向其添加“.php”来处理所有其他网址:

    RewriteCond %{REQUEST_URI} ^/(.*?)\.php$
    RewriteRule ^/.*$ /%1 [R=301,QSA,L]

    RewriteRule ^/(.*)$ /$1.php

例如,

/page.php将重定向到/page并处理page.php

答案 1 :(得分:0)

好的,写下这样的东西。

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName deli.localhost

    DocumentRoot /var/www/deli/
    <Directory /var/www/deli/>
        Options -Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all

                RewriteEngine on

                ## Externally redirect clients directly requesting .(php|aspx|html|htm|pl|cgi|asp)+ page 
                ## URIs to extensionless URIs
                ## If client request header contains php,aspx,html or htm file extension, redirect
                ## It avoids an infinite loop since "THE_REQUEST" is what the UA asks for, not what the 
                ## server translates it to on the second pass.
                ## THE_REQUEST syntax is something like: GET /page.html HTTP/1.0
                RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.(php|aspx|html|htm|pl|cgi|asp)+(/.*)?\ HTTP [NC]
                RewriteRule ^([^.]+)\.(php|aspx|html|htm|pl|cgi|asp)+(/.*)?$ http://xyz.com/$1$3 [NC,R=301,L]


                FileETag none





                ErrorDocument 401 /401.php
                ErrorDocument 403 /403.php
                ErrorDocument 404 /404.php
                ErrorDocument 500 /500.php
                ErrorDocument 503 /503.php
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
</VirtualHost>

答案 2 :(得分:-1)

在另一篇文章中找到了这个。它显然剥离了网址扩展名.php,.html,.cgi。

RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)/$ $1.html [L]

RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)/$ $1.php [L]

RewriteCond %{REQUEST_URI} (.*)/$
RewriteCond %{REQUEST_FILENAME}\.cgi -f
RewriteRule (.*)/$ $1.cgi [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f [OR]
RewriteCond %{REQUEST_FILENAME}\.php -f [OR]
RewriteCond %{REQUEST_FILENAME}\.cgi -f
RewriteRule .* %{REQUEST_FILENAME}/ [R=301,L]