Apache-2.4

ScriptAlias 位置上查詢字元串的 mod_rewrite 規則

  • October 18, 2017

設置:一個QGis-2.18 伺服器(實際上是一個嵌入式MapServer)實例,通過 Ubuntu 上的 Apache-2.4.18 中的 FastCGI。

如果在 cgi 處理程序的查詢字元串中設置了某個值,我想添加另一個值。為此,我在頂部添加了三行/etc/apache2/conf-enabled/qgis.conf

RewriteEngine on
RewriteCond "%{QUERY_STRING}" "application/json" [NC]
RewriteRule "^/$" "/?OUTPUTFORMAT=GeoJSON" [PT,QSA]

ScriptAlias / /usr/lib/cgi-bin/qgis_mapserv.fcgi
<Location "/">
   SetHandler fcgid-script
   Require all granted
   PassEnv QGIS_PROJECT_FILE
</Location>

FcgidInitialEnv QGIS_LOG_FILE ${QGIS_LOG_FILE}
FcgidInitialEnv QGIS_SERVER_LOG_FILE ${QGIS_SERVER_LOG_FILE}
FcgidInitialEnv QGIS_DEBUG ${QGIS_DEBUG}
FcgidInitialEnv QGIS_SERVER_LOG_LEVEL ${QGIS_SERVER_LOG_LEVEL}
FcgidInitialEnv QGIS_PLUGINPATH "${QGIS_PLUGINPATH}"
FcgidInitialEnv PGSERVICEFILE ${PGSERVICEFILE}
FcgidInitialEnv HOME /var/www

我正在像這樣訪問伺服器:

http://myserver.invalid.tld:51081/
   ?SERVICE=WFS
   &VERSION=1.1.0
   &REQUEST=GetFeature
   &OUTPUTFORMAT=application/json
   &MAXFEATURES=1
   &SRSNAME=EPSG:4326
   &TYPENAME=feature_type_name
   &BBOX=8.5985658,56.447691,8.600106,56.448553

我本來希望效果與我&OUTPUTFORMAT=GeoJSON在 URL 末尾手動附加的效果相同,但在重新啟動 apache 後我完全看不到任何區別。(是的,我已經跑了sudo a2enmod rewrite。)

我不確定重寫規則和腳本別名之間的互動是如何工作的,所以我認為一個會影響另一個?不幸的是,我也不知道如何調試它。

伺服器啟用了一個虛擬主機,對我來說這看起來像 OOTB 配置:

# apache2ctl -S
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.10. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
*:80                   172.17.0.10 (/etc/apache2/sites-enabled/000-default.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/proc/self/fd/2"
Mutex default: dir="/var/lock/apache2" mechanism=fcntl
Mutex fcgid-pipe: using_defaults
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex fcgid-proctbl: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33 

這是/etc/apache2/sites-enabled/000-default.conf(刪除評論):

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html
   ErrorLog /proc/self/fd/2
   CustomLog /proc/self/fd/1 combined
</VirtualHost>

最後apache2.conf(再次刪除評論):

Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog /proc/self/fd/2
LogLevel warn

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf

<Directory />
   Options FollowSymLinks
   AllowOverride None
   Require all denied
</Directory>

<Directory /usr/share>
   AllowOverride None
   Require all granted
</Directory>

<Directory /var/www/>
   Options Indexes FollowSymLinks
   AllowOverride None
   Require all granted
</Directory>

AccessFileName .htaccess

<FilesMatch "^\.ht">
   Require all denied
</FilesMatch>

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

(對於獎勵積分,我想在查詢字元串中替換 為,但如果我可以將參數附加到開頭,我就接近目標了。)application/json``GeoJSON

我本來希望效果與手動附加的效果相同&OUTPUTFORMAT=GeoJSON

好吧,這可能是“問題”;它沒有附加附加了請求的原始查詢字元串。替換字元串中的查詢字元串 ( OUTPUTFORMAT=GeoJSON) 位於查詢字元串的開頭。因此,根據您如何讀取/解析查詢字元串中的參數,您的新設置可能會被覆蓋。

要專門將某些內容附加到現有查詢字元串,您可以在替換QUERY_STRING中使用伺服器變數(而不是使用標誌)。例如:QSA

RewriteCond %{QUERY_STRING} application/json
RewriteRule ^/$ /?%{QUERY_STRING}&OUTPUTFORMAT=GeoJSON [PT]

無需將每個參數都用引號括起來,除非它們包含空格。僅NC當您特別需要不區分大小寫的匹配時才使用該標誌。

或者,要替換請求中的OUTPUTFORMAT=application/jsonURL 參數,您可以執行以下操作:

RewriteCond %{QUERY_STRING} (.*)OUTPUTFORMAT=application/json(.*)
RewriteRule ^/$ /?%1OUTPUTFORMAT=GeoJSON%2 [PT]

%1並且%2是對前面的CondPattern中擷取的組的反向引用。IE。查詢字元串中原始 URL 參數之前之後的所有內容。

引用自:https://serverfault.com/questions/879054