apache和php实现URL伪静态URL


伪静态URL分两种,以read.php页面为例,第一种是http://localhost/read.php/path/1234;第二种为http://localhost/read/path/1234。从隐私上来说,第二种更加彻底。下面来看看如何实现。以下代码在windows+apache2.4和群晖DSM7.2+apache2.4测试通过(均为php7)。

第一种效果

不需要动apache,只要在read.php中将下面path解释,然后实现你所需参数传递即可

$request = $_SERVER['REQUEST_URI'];
$path = parse_url($request, PHP_URL_PATH);
$path = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

访问地址:http://localhost/read.php/path/1234

第二种效果

分3步:
1、apache配置文件中启用mod_rewrite.so(确保mod_rewrite.so文件存在)

LoadModule rewrite_module modules/mod_rewrite.so

然后开启重写,将AllowOverride 从None更改为All,当然还有其他玩法,自己探索。

<Directory "网站目录">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

2、在网站跟目录下启用.htaccess文件,里面内容如下

<IfModule mod_rewrite.c>

RewriteEngine On
# 禁用MultiViews, 它会尝试自动匹配文件名,比如你访问 /read,它会尝试匹配 read.php,这会干扰重写规则的执行。

Options -MultiViews
# 只对以 /read/ 开头的请求进行处理
# RewriteCond %{REQUEST_URI} ^/read/(.*)$ [NC]

# 确保请求不是实际存在的文件或目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 将匹配的请求重定向到 read.php,并保持路径信息
RewriteRule ^read/(.*)$ /read.php/$1 [L,QSA]
</IfModule>

这里面有个我花了很长时间才实践出一个区别:
群晖系统中需要加 Options -MultiViews
windows中 可将Options -MultiViews替换为 RewriteCond %{REQUEST_URI} ^/read/(.*)$ [NC]

3、read.php页面内容同第一种
访问地址:http://localhost/read/path/1234

声明:Alber.F|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - apache和php实现URL伪静态URL

医疗器械质量和注册管理的信息化的尝试者